yai-loguru-sinks


Nameyai-loguru-sinks JSON
Version 0.6.2 PyPI version JSON
download
home_pageNone
Summary企业级 Loguru Sink 工厂,基于 loguru-config 的简洁架构,专注于阿里云 SLS 支持
upload_time2025-07-26 09:08:37
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords aliyun enterprise logging loguru sink sls
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # yai-loguru-sinks

企业级 Loguru Sink 工厂库,基于 `loguru-config` 提供统一的配置驱动体验。

## 核心理念

- **简洁架构**:移除复杂的插件抽象,直接提供 sink 工厂函数
- **配置驱动**:基于 `loguru-config` 的统一配置体验
- **企业级**:专注于阿里云 SLS 日志服务,未来扩展更多云服务
- **原生兼容**:完全兼容 Loguru 的 sink 机制

## 快速开始

### 安装

```bash
uv add yai-loguru-sinks
```

### 基本使用

```python
from yai_loguru_sinks import register_protocol_parsers, create_config_from_file

# 注册企业级协议解析器
register_protocol_parsers()

# 配置驱动,一行搞定
create_config_from_file('logging.yaml')
```

### 配置文件示例

```yaml
# logging.yaml
handlers:
  # 阿里云 SLS
  - sink: sls://my-project/my-logstore?region=cn-hangzhou&access_key_id=${SLS_ACCESS_KEY}&access_key_secret=${SLS_SECRET}
    level: WARNING
    format: '{time} | {level} | {message}'
    
  # 本地文件(Loguru 原生)
  - sink: logs/app.log
    rotation: "1 day"
    retention: "30 days"
    compression: "gz"
```

## 支持的协议

### 阿里云 SLS
```yaml
sink: sls://project/logstore?region=cn-hangzhou&access_key_id=xxx&access_key_secret=xxx
```

**参数说明:**
- `project`: SLS 项目名称
- `logstore`: SLS 日志库名称  
- `region`: 阿里云地域(如 cn-hangzhou)
- `access_key_id`: 阿里云访问密钥 ID
- `access_key_secret`: 阿里云访问密钥 Secret

**环境变量支持:**
```yaml
sink: sls://my-project/my-logstore?region=cn-hangzhou&access_key_id=${SLS_ACCESS_KEY}&access_key_secret=${SLS_SECRET}
```

## API 参考

### 核心函数

#### `register_protocol_parsers()`
注册所有支持的协议解析器(SLS、CloudWatch、Elasticsearch、Kafka 等)。

```python
from yai_loguru_sinks import register_protocol_parsers

# 注册协议解析器
register_protocol_parsers()
```

#### `create_config_from_file(config_path: str)`
从 YAML/JSON 配置文件加载日志配置。

```python
from yai_loguru_sinks import create_config_from_file

# 从文件加载配置
create_config_from_file('logging.yaml')
```

#### `create_config_from_dict(config_dict: dict)`
从字典对象加载日志配置。

```python
from yai_loguru_sinks import create_config_from_dict

config = {
    "handlers": [
        {
            "sink": "sls://my-project/my-logstore?region=cn-hangzhou",
            "level": "INFO"
        }
    ]
}
create_config_from_dict(config)
```

## 直接使用 Sink 工厂

如果不使用配置文件,也可以直接调用内部的 sink 工厂:

```python
from loguru import logger
from yai_loguru_sinks.internal.factory import create_sls_sink

# 创建 SLS sink
sls_sink = create_sls_sink(
    project="my-project",
    logstore="my-logstore",
    region="cn-hangzhou",
    access_key_id="xxx",
    access_key_secret="xxx"
)

# 添加到 logger
logger.add(sls_sink, level="WARNING")
```

## 特性功能

### PackId 支持
自动为每个日志记录生成唯一的 PackId,便于日志关联和追踪。

### 异步处理
高性能异步日志发送,不阻塞主线程。

### 优雅降级
当云服务不可用时,自动降级到本地文件日志。

### 环境变量支持
配置文件中可以使用 `${VAR_NAME}` 语法引用环境变量。

## 架构优势

### 相比传统插件系统
- ✅ **移除冗余抽象**:不再需要 `LoguruPlugin` 基类
- ✅ **简化使用方式**:统一的配置文件格式
- ✅ **利用成熟生态**:基于 `loguru-config` 的稳定基础
- ✅ **保持功能完整**:所有企业级功能都保留

### 设计原则
1. **职责分离**:`loguru` 负责基础功能,`yai-loguru-sinks` 负责企业级扩展
2. **配置驱动**:通过 YAML/JSON 配置,而非代码硬编码
3. **协议扩展**:利用 `loguru-config` 的协议解析机制
4. **工厂模式**:提供灵活的 sink 创建函数

## 许可证

MIT License
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "yai-loguru-sinks",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "aliyun, enterprise, logging, loguru, sink, sls",
    "author": null,
    "author_email": "Harry Tang <harry@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/37/f7/08d11db050dbc3b8f9adde5327462734aeb2fdb56d37e702b367ec4e151f/yai_loguru_sinks-0.6.2.tar.gz",
    "platform": null,
    "description": "# yai-loguru-sinks\n\n\u4f01\u4e1a\u7ea7 Loguru Sink \u5de5\u5382\u5e93\uff0c\u57fa\u4e8e `loguru-config` \u63d0\u4f9b\u7edf\u4e00\u7684\u914d\u7f6e\u9a71\u52a8\u4f53\u9a8c\u3002\n\n## \u6838\u5fc3\u7406\u5ff5\n\n- **\u7b80\u6d01\u67b6\u6784**\uff1a\u79fb\u9664\u590d\u6742\u7684\u63d2\u4ef6\u62bd\u8c61\uff0c\u76f4\u63a5\u63d0\u4f9b sink \u5de5\u5382\u51fd\u6570\n- **\u914d\u7f6e\u9a71\u52a8**\uff1a\u57fa\u4e8e `loguru-config` \u7684\u7edf\u4e00\u914d\u7f6e\u4f53\u9a8c\n- **\u4f01\u4e1a\u7ea7**\uff1a\u4e13\u6ce8\u4e8e\u963f\u91cc\u4e91 SLS \u65e5\u5fd7\u670d\u52a1\uff0c\u672a\u6765\u6269\u5c55\u66f4\u591a\u4e91\u670d\u52a1\n- **\u539f\u751f\u517c\u5bb9**\uff1a\u5b8c\u5168\u517c\u5bb9 Loguru \u7684 sink \u673a\u5236\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u5b89\u88c5\n\n```bash\nuv add yai-loguru-sinks\n```\n\n### \u57fa\u672c\u4f7f\u7528\n\n```python\nfrom yai_loguru_sinks import register_protocol_parsers, create_config_from_file\n\n# \u6ce8\u518c\u4f01\u4e1a\u7ea7\u534f\u8bae\u89e3\u6790\u5668\nregister_protocol_parsers()\n\n# \u914d\u7f6e\u9a71\u52a8\uff0c\u4e00\u884c\u641e\u5b9a\ncreate_config_from_file('logging.yaml')\n```\n\n### \u914d\u7f6e\u6587\u4ef6\u793a\u4f8b\n\n```yaml\n# logging.yaml\nhandlers:\n  # \u963f\u91cc\u4e91 SLS\n  - sink: sls://my-project/my-logstore?region=cn-hangzhou&access_key_id=${SLS_ACCESS_KEY}&access_key_secret=${SLS_SECRET}\n    level: WARNING\n    format: '{time} | {level} | {message}'\n    \n  # \u672c\u5730\u6587\u4ef6\uff08Loguru \u539f\u751f\uff09\n  - sink: logs/app.log\n    rotation: \"1 day\"\n    retention: \"30 days\"\n    compression: \"gz\"\n```\n\n## \u652f\u6301\u7684\u534f\u8bae\n\n### \u963f\u91cc\u4e91 SLS\n```yaml\nsink: sls://project/logstore?region=cn-hangzhou&access_key_id=xxx&access_key_secret=xxx\n```\n\n**\u53c2\u6570\u8bf4\u660e\uff1a**\n- `project`: SLS \u9879\u76ee\u540d\u79f0\n- `logstore`: SLS \u65e5\u5fd7\u5e93\u540d\u79f0  \n- `region`: \u963f\u91cc\u4e91\u5730\u57df\uff08\u5982 cn-hangzhou\uff09\n- `access_key_id`: \u963f\u91cc\u4e91\u8bbf\u95ee\u5bc6\u94a5 ID\n- `access_key_secret`: \u963f\u91cc\u4e91\u8bbf\u95ee\u5bc6\u94a5 Secret\n\n**\u73af\u5883\u53d8\u91cf\u652f\u6301\uff1a**\n```yaml\nsink: sls://my-project/my-logstore?region=cn-hangzhou&access_key_id=${SLS_ACCESS_KEY}&access_key_secret=${SLS_SECRET}\n```\n\n## API \u53c2\u8003\n\n### \u6838\u5fc3\u51fd\u6570\n\n#### `register_protocol_parsers()`\n\u6ce8\u518c\u6240\u6709\u652f\u6301\u7684\u534f\u8bae\u89e3\u6790\u5668\uff08SLS\u3001CloudWatch\u3001Elasticsearch\u3001Kafka \u7b49\uff09\u3002\n\n```python\nfrom yai_loguru_sinks import register_protocol_parsers\n\n# \u6ce8\u518c\u534f\u8bae\u89e3\u6790\u5668\nregister_protocol_parsers()\n```\n\n#### `create_config_from_file(config_path: str)`\n\u4ece YAML/JSON \u914d\u7f6e\u6587\u4ef6\u52a0\u8f7d\u65e5\u5fd7\u914d\u7f6e\u3002\n\n```python\nfrom yai_loguru_sinks import create_config_from_file\n\n# \u4ece\u6587\u4ef6\u52a0\u8f7d\u914d\u7f6e\ncreate_config_from_file('logging.yaml')\n```\n\n#### `create_config_from_dict(config_dict: dict)`\n\u4ece\u5b57\u5178\u5bf9\u8c61\u52a0\u8f7d\u65e5\u5fd7\u914d\u7f6e\u3002\n\n```python\nfrom yai_loguru_sinks import create_config_from_dict\n\nconfig = {\n    \"handlers\": [\n        {\n            \"sink\": \"sls://my-project/my-logstore?region=cn-hangzhou\",\n            \"level\": \"INFO\"\n        }\n    ]\n}\ncreate_config_from_dict(config)\n```\n\n## \u76f4\u63a5\u4f7f\u7528 Sink \u5de5\u5382\n\n\u5982\u679c\u4e0d\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528\u5185\u90e8\u7684 sink \u5de5\u5382\uff1a\n\n```python\nfrom loguru import logger\nfrom yai_loguru_sinks.internal.factory import create_sls_sink\n\n# \u521b\u5efa SLS sink\nsls_sink = create_sls_sink(\n    project=\"my-project\",\n    logstore=\"my-logstore\",\n    region=\"cn-hangzhou\",\n    access_key_id=\"xxx\",\n    access_key_secret=\"xxx\"\n)\n\n# \u6dfb\u52a0\u5230 logger\nlogger.add(sls_sink, level=\"WARNING\")\n```\n\n## \u7279\u6027\u529f\u80fd\n\n### PackId \u652f\u6301\n\u81ea\u52a8\u4e3a\u6bcf\u4e2a\u65e5\u5fd7\u8bb0\u5f55\u751f\u6210\u552f\u4e00\u7684 PackId\uff0c\u4fbf\u4e8e\u65e5\u5fd7\u5173\u8054\u548c\u8ffd\u8e2a\u3002\n\n### \u5f02\u6b65\u5904\u7406\n\u9ad8\u6027\u80fd\u5f02\u6b65\u65e5\u5fd7\u53d1\u9001\uff0c\u4e0d\u963b\u585e\u4e3b\u7ebf\u7a0b\u3002\n\n### \u4f18\u96c5\u964d\u7ea7\n\u5f53\u4e91\u670d\u52a1\u4e0d\u53ef\u7528\u65f6\uff0c\u81ea\u52a8\u964d\u7ea7\u5230\u672c\u5730\u6587\u4ef6\u65e5\u5fd7\u3002\n\n### \u73af\u5883\u53d8\u91cf\u652f\u6301\n\u914d\u7f6e\u6587\u4ef6\u4e2d\u53ef\u4ee5\u4f7f\u7528 `${VAR_NAME}` \u8bed\u6cd5\u5f15\u7528\u73af\u5883\u53d8\u91cf\u3002\n\n## \u67b6\u6784\u4f18\u52bf\n\n### \u76f8\u6bd4\u4f20\u7edf\u63d2\u4ef6\u7cfb\u7edf\n- \u2705 **\u79fb\u9664\u5197\u4f59\u62bd\u8c61**\uff1a\u4e0d\u518d\u9700\u8981 `LoguruPlugin` \u57fa\u7c7b\n- \u2705 **\u7b80\u5316\u4f7f\u7528\u65b9\u5f0f**\uff1a\u7edf\u4e00\u7684\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\n- \u2705 **\u5229\u7528\u6210\u719f\u751f\u6001**\uff1a\u57fa\u4e8e `loguru-config` \u7684\u7a33\u5b9a\u57fa\u7840\n- \u2705 **\u4fdd\u6301\u529f\u80fd\u5b8c\u6574**\uff1a\u6240\u6709\u4f01\u4e1a\u7ea7\u529f\u80fd\u90fd\u4fdd\u7559\n\n### \u8bbe\u8ba1\u539f\u5219\n1. **\u804c\u8d23\u5206\u79bb**\uff1a`loguru` \u8d1f\u8d23\u57fa\u7840\u529f\u80fd\uff0c`yai-loguru-sinks` \u8d1f\u8d23\u4f01\u4e1a\u7ea7\u6269\u5c55\n2. **\u914d\u7f6e\u9a71\u52a8**\uff1a\u901a\u8fc7 YAML/JSON \u914d\u7f6e\uff0c\u800c\u975e\u4ee3\u7801\u786c\u7f16\u7801\n3. **\u534f\u8bae\u6269\u5c55**\uff1a\u5229\u7528 `loguru-config` \u7684\u534f\u8bae\u89e3\u6790\u673a\u5236\n4. **\u5de5\u5382\u6a21\u5f0f**\uff1a\u63d0\u4f9b\u7075\u6d3b\u7684 sink \u521b\u5efa\u51fd\u6570\n\n## \u8bb8\u53ef\u8bc1\n\nMIT License",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u4f01\u4e1a\u7ea7 Loguru Sink \u5de5\u5382\uff0c\u57fa\u4e8e loguru-config \u7684\u7b80\u6d01\u67b6\u6784\uff0c\u4e13\u6ce8\u4e8e\u963f\u91cc\u4e91 SLS \u652f\u6301",
    "version": "0.6.2",
    "project_urls": {
        "Documentation": "https://github.com/your-org/yai-loguru-sinks#readme",
        "Homepage": "https://github.com/your-org/yai-loguru-sinks",
        "Issues": "https://github.com/your-org/yai-loguru-sinks/issues",
        "Repository": "https://github.com/your-org/yai-loguru-sinks"
    },
    "split_keywords": [
        "aliyun",
        " enterprise",
        " logging",
        " loguru",
        " sink",
        " sls"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fd2d03bc3c91c84e7aefa216b4236e62aea32ec58a4202681230e03a218be51e",
                "md5": "77c961a6796204c1b18a0d2d98ab64b7",
                "sha256": "65a847a13f2517e89104b87fd9b75fdf7c22b83b1c79ccc6349019633e89e336"
            },
            "downloads": -1,
            "filename": "yai_loguru_sinks-0.6.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "77c961a6796204c1b18a0d2d98ab64b7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 15327,
            "upload_time": "2025-07-26T09:08:36",
            "upload_time_iso_8601": "2025-07-26T09:08:36.493699Z",
            "url": "https://files.pythonhosted.org/packages/fd/2d/03bc3c91c84e7aefa216b4236e62aea32ec58a4202681230e03a218be51e/yai_loguru_sinks-0.6.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "37f708d11db050dbc3b8f9adde5327462734aeb2fdb56d37e702b367ec4e151f",
                "md5": "0fb41bf3ff4021f911c0eb1ae3255f1b",
                "sha256": "a2278bb69dc130d7f8d81c3b304e98db87f7c69799b5f37da1b8dc6c0f130c95"
            },
            "downloads": -1,
            "filename": "yai_loguru_sinks-0.6.2.tar.gz",
            "has_sig": false,
            "md5_digest": "0fb41bf3ff4021f911c0eb1ae3255f1b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 103963,
            "upload_time": "2025-07-26T09:08:37",
            "upload_time_iso_8601": "2025-07-26T09:08:37.598933Z",
            "url": "https://files.pythonhosted.org/packages/37/f7/08d11db050dbc3b8f9adde5327462734aeb2fdb56d37e702b367ec4e151f/yai_loguru_sinks-0.6.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-26 09:08:37",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "your-org",
    "github_project": "yai-loguru-sinks#readme",
    "github_not_found": true,
    "lcname": "yai-loguru-sinks"
}
        
Elapsed time: 1.25974s