{"id":13635501,"url":"https://github.com/houbb/auto-log","last_synced_at":"2025-10-01T22:31:30.001Z","repository":{"id":37111764,"uuid":"267592347","full_name":"houbb/auto-log","owner":"houbb","description":"The auto log tool for java.(java 自动日志输出，基于字节码，兼容 spring)","archived":false,"fork":false,"pushed_at":"2024-03-23T03:53:25.000Z","size":377,"stargazers_count":53,"open_issues_count":4,"forks_count":28,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-06T21:44:24.255Z","etag":null,"topics":["asm","auto-logging","autolog","autologger","awesome","awesome-java","log","logging","monitor","spring","spring-boot","traceid"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/houbb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-28T13:06:39.000Z","updated_at":"2024-12-20T04:41:56.000Z","dependencies_parsed_at":"2023-10-10T16:09:21.854Z","dependency_job_id":"5e8f7683-48a0-491b-8f8f-ce378c7819ae","html_url":"https://github.com/houbb/auto-log","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fauto-log","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fauto-log/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fauto-log/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fauto-log/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/houbb","download_url":"https://codeload.github.com/houbb/auto-log/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234908969,"owners_count":18905500,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asm","auto-logging","autolog","autologger","awesome","awesome-java","log","logging","monitor","spring","spring-boot","traceid"],"created_at":"2024-08-02T00:00:46.407Z","updated_at":"2025-10-01T22:31:29.994Z","avatar_url":"https://github.com/houbb.png","language":"Java","readme":"# auto-log\n\n[auto-log](https://github.com/houbb/auto-log) 是一款为 java 设计的自动日志监控框架。\n\n[![Build Status](https://travis-ci.com/houbb/auto-log.svg?branch=master)](https://travis-ci.com/houbb/auto-log)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.houbb/auto-log/badge.svg)](http://mvnrepository.com/artifact/com.github.houbb/auto-log)\n[![](https://img.shields.io/badge/license-Apache2-FF0080.svg)](https://github.com/houbb/auto-log/blob/master/LICENSE.txt)\n[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/houbb/auto-log)\n\n## 创作目的\n\n经常会写一些工具，有时候手动加一些日志很麻烦，引入 spring 又过于大材小用。\n\n所以希望从从简到繁实现一个工具，便于平时使用。\n\n## 特性\n\n- 基于注解+字节码，配置灵活\n\n- 自动适配常见的日志框架\n\n- 支持编程式的调用\n\n- 支持注解式，完美整合 spring\n\n- 支持整合 spring-boot\n\n- 支持慢日志阈值指定，耗时，入参，出参，异常信息等常见属性指定\n\n- 支持 traceId 特性\n\n- 支持类级别定义注解\n\n- 支持自定义拦截器和过滤器\n\n- 支持 spring aop 注解切面自定义\n\n- 支持类似 dubbo filter 的拦截器链式调用\n\n- 支持日志条件输出，支持日志自适应输出\n\n- 支持日志的超长截断+丢弃策略，避免极端情况的性能问题\n\n## 项目推荐\n\n下面是一些日志、加解密、脱敏安全相关的库推荐：\n\n| 项目                                                                    | 介绍                    |\n|:----------------------------------------------------------------------|:----------------------|\n| [sensitive-word](https://github.com/houbb/sensitive-word)             | 高性能敏感词核心库             |\n| [sensitive-word-admin](https://github.com/houbb/sensitive-word-admin) | 敏感词控台，前后端分离           |\n| [sensitive](https://github.com/houbb/sensitive)                       | 高性能日志脱敏组件             |\n| [auto-log](https://github.com/houbb/auto-log)                         | 统一日志切面组件，支持全链路traceId |\n| [encryption-local](https://github.com/houbb/encryption-local)         | 离线加密机组件               |\n| [encryption](https://github.com/houbb/encryption)         | 加密机标准API+本地客户端        |\n| [encryption-server](https://github.com/houbb/encryption-server)        | 加密机服务                 |\n\n## 变更日志\n\n\u003e [变更日志](https://github.com/houbb/auto-log/blob/master/CHANGELOG.md)\n\nV0.11.0 变更\n\n- 支持日志的超长截断+丢弃策略，避免极端情况的性能问题\n\n## 拓展阅读\n\n[日志开源组件（一）java 注解结合 spring aop 实现自动输出日志](https://houbb.github.io/2023/08/06/auto-log-01-overview)\n\n[日志开源组件（二）java 注解结合 spring aop 实现日志traceId唯一标识](https://houbb.github.io/2023/08/06/auto-log-02-trace-id)\n\n[日志开源组件（三）java 注解结合 spring aop 自动输出日志新增拦截器与过滤器](https://houbb.github.io/2023/08/06/auto-log-03-filter)\n\n[日志开源组件（四）如何动态修改 spring aop 切面信息？让自动日志输出框架更好用](https://houbb.github.io/2023/08/06/auto-log-04-dynamic-aop)\n\n[日志开源组件（五）如何将 dubbo filter 拦截器原理运用到日志拦截器中？](https://houbb.github.io/2023/08/06/auto-log-05-dubbo-interceptor)\n\n[日志开源组件（六）Adaptive Sampling 自适应采样](https://mp.weixin.qq.com/s/9JH3WfR6Y474LCbY2mZxZQ)\n\n[高性能日志脱敏组件（一）java 日志脱敏框架 sensitive，优雅的打印脱敏日志](https://mp.weixin.qq.com/s/xzQNDF7s705iurk7N0uheQ)\n\n[高性能日志脱敏组件（二）金融用户敏感数据如何优雅地实现脱敏？](https://mp.weixin.qq.com/s/ljChFiNLzV6GLaUDjehA0Q)\n\n[高性能日志脱敏组件（三）日志脱敏之后，无法根据信息快速定位怎么办？](https://mp.weixin.qq.com/s/tZqOH_8QTKrD1oaclNoewg)\n\n[高性能日志脱敏组件（四）基于 log4j2 插件实现统一日志脱敏，性能远超正则替换](https://mp.weixin.qq.com/s/ZlWRqT7S92aXFuy-l9Uh3Q)\n\n[高性能日志脱敏组件（五）已支持 log4j2 和 logback 插件](https://mp.weixin.qq.com/s/3ARK6PW7pyUhAbO2ctnndg)\n\n# 快速开始\n\n## maven 引入\n\n```xml\n\u003cdependency\u003e\n    \u003cgroup\u003ecom.github.houbb\u003c/group\u003e\n    \u003cartifact\u003eauto-log-core\u003c/artifact\u003e\n    \u003cversion\u003e0.12.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## 入门案例\n\n```java\nUserService userService = AutoLogHelper.proxy(new UserServiceImpl());\nuserService.queryLog(\"1\");\n```\n\n- 日志如下\n\n```\n信息: [TID=9d5ad747342e4f909d42001f1419c58b][METHOD=com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog:java.lang.String#查询日志][PARAM=[\"1\"]][RESULT=\"result-1\"][COST=607 ms]\n```\n\n### 属性说明 \n\n| 属性     | 说明    |\n|:-------|:------|\n| TID    | 日志跟踪号 |\n| METHOD | 方法签名  |\n| PARAM  | 方法入参  |\n| RESULT | 方法出参  |\n| COST   | 方法耗时  |\n| SLOW-THRESHOLD   | 慢日志阈值 |\n| EXCEPTION   | 方法异常  |\n\n### 代码\n\n其中方法实现如下：\n\n- UserService.java\n\n```java\npublic interface UserService {\n\n    String queryLog(final String id);\n\n}\n```\n\n- UserServiceImpl.java\n\n直接使用注解 `@AutoLog` 指定需要打日志的方法即可。\n\n```java\npublic class UserServiceImpl implements UserService {\n\n    @Override\n    @AutoLog(description = \"查询日志\", enableTraceId = true)\n    public String queryLog(String id) {\n        return \"result-\"+id;\n    }\n\n}\n```\n\n# 注解说明\n\n## @AutoLog\n\n核心注解 `@AutoLog` 的属性说明如下：\n\n| 属性 | 类型 | 默认值 | 说明 |\n|:--|:--|:--|:--|\n| enable | boolean | true | 是否启用 |\n| param | boolean | true | 是否打印入参 |\n| result | boolean | true | 是否打印出参 |\n| costTime | boolean | false | 是否打印耗时 |\n| exception | boolean | true | 是否打印异常 |\n| slowThresholdMills | long | -1 | 当这个值大于等于 0 时，且耗时超过配置值，会输出慢日志 |\n| description | string |\"\" | 方法描述，默认选择方法名称 |\n| paramFilter | Class | WebParamFilter | 入参过滤器，支持自定义 |\n| traceId | Class | Id.class | 日志跟踪号生成策略 |\n| enableTraceId | boolean | true | 是否启用 traceId 的变化 |\n\n使用建议，在入口的方法中设置 `enableTraceId=true`，会统一设置 traceId，贯穿整个日志周期。 底层依赖的 service/biz 层等，设置为 false 即可。\n\n# 自定义策略\n\n## 自定义日志拦截器（interceptor）\n\n### 内置拦截器\n\n`AutoLogCommonFilter` 默认日志增强实现\n\n### 定义\n\n直接实现 `CommonFilter` 类，并且实现对应的方法即可。\n\n```java\npackage com.github.houbb.auto.log.test.interceptor;\n\nimport com.github.houbb.auto.log.core.constant.AutoLogAttachmentKeyConst;\nimport com.github.houbb.common.filter.annotation.FilterActive;\nimport com.github.houbb.common.filter.api.CommonFilter;\nimport com.github.houbb.common.filter.api.Invocation;\nimport com.github.houbb.common.filter.api.Invoker;\nimport com.github.houbb.common.filter.api.Result;\nimport com.github.houbb.common.filter.exception.CommonFilterException;\n\n/**\n * 自定义日志拦截器\n * @author binbin.hou\n * @since 0.0.12\n */\n@FilterActive(order = 1)\npublic class MyAutoLogInterceptor implements CommonFilter {\n\n    @Override\n    public Result invoke(Invoker invoker, Invocation invocation) throws CommonFilterException {\n        final String tid = (String) invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_TRACE_ID);\n        System.out.println(\"my test filter before \" + tid);\n        Result result = invoker.invoke(invocation);\n        System.out.println(\"my test filter after \" + tid);\n\n        return result;\n    }\n\n}\n```\n\n我们可以通过 `@FilterActive(order = 1)` 指定拦截器执行的顺序，数值越小，越先执行。\n\n`invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_TRACE_ID)` 可以获取 invocation 中传递的属性。\n\n### 使用\n\nSPI 指定\n\n创建文件 `resources\\META-INF\\services\\com.github.houbb.common.filter.api.CommonFilter`\n\n在文件中指定我们定义的接口：\n\n```\ncom.github.houbb.auto.log.test.interceptor.MyAutoLogInterceptor\n```\n\n### 测试效果\n\n```\nmy test filter before 2bc181d4efb8408e948072022c9227c0\nmy test filter after 2bc181d4efb8408e948072022c9227c0\n八月 06, 2023 8:13:19 下午 com.github.houbb.auto.log.core.support.interceptor.chain.AutoLogCommonFilter info\n信息: [TID=2bc181d4efb8408e948072022c9227c0][METHOD=com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog:java.lang.String#查询日志][PARAM=[\"1\"]][RESULT=\"result-1\"][COST=535 ms]\n```\n\n## 自定义入参过滤器（paramFilter）\n\n### 内置\n\n`WebParamFilter` 主要用于过滤 HttpRequest HttpServlet 等无法直接 JSON 序列化的对象。\n\n### 自定义\n\n直接继承 `AbstractParamFilter` 类实现对应的方法即可。\n\n```java\npublic class MyParamFilter extends AbstractParamFilter {\n\n    @Override\n    protected Object[] doFilter(Object[] params) {\n        Object[] newParams = new Object[1];\n        newParams[0] = \"设置我我想要的值\";\n        return newParams;\n    }\n\n}\n```\n\n### 使用\n\n指定对应的参数过滤器。这样，无论入参是什么，都会变成我们指定的 `[设置我我想要的值]`。\n\n```java\n@AutoLog(paramFilter = MyParamFilter.class)\npublic String paramFilter() {\n    return \"自定义入参过滤器\";\n}\n```\n\n\n# spring 整合使用\n\n完整示例参考 [SpringServiceTest](https://github.com/houbb/auto-log/tree/master/auto-log-test/src/test/java/com/github/houbb/auto/log/spring/SpringServiceTest.java)\n\n## maven 引入\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.houbb\u003c/groupId\u003e\n    \u003cartifactId\u003eauto-log-spring\u003c/artifactId\u003e\n    \u003cversion\u003e0.12.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## 注解声明\n\n使用 `@EnableAutoLog` 启用自动日志输出\n\n```java\n@Configurable\n@ComponentScan(basePackages = \"com.github.houbb.auto.log.test.service\")\n@EnableAutoLog\npublic class SpringConfig {\n}\n```\n\n## 测试代码\n\n```java\n@ContextConfiguration(classes = SpringConfig.class)\n@RunWith(SpringJUnit4ClassRunner.class)\npublic class SpringServiceTest {\n\n    @Autowired\n    private UserService userService;\n\n    @Test\n    public void queryLogTest() {\n        userService.queryLog(\"1\");\n    }\n\n}\n```\n\n- 输出结果\n\n```\n信息: public java.lang.String com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog(java.lang.String) param is [1]\n五月 30, 2020 12:17:51 下午 com.github.houbb.auto.log.core.support.interceptor.AutoLogMethodInterceptor info\n信息: public java.lang.String com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog(java.lang.String) result is result-1\n五月 30, 2020 12:17:51 下午 org.springframework.context.support.GenericApplicationContext doClose\n```\n\n## 切面自定义\n\n### 原理解释\n\nspring aop 的切面读取自 `@Value(\"${auto.log.pointcut}\")`，默认为值 `@within(com.github.houbb.auto.log.annotation.AutoLog)||@annotation(com.github.houbb.auto.log.annotation.AutoLog)`\n\n也就是默认是读取被 `@AutoLog` 指定的方法或者类。\n\n当然，这并不够方便，我们希望可以想平时写 aop 注解一样，指定 spring aop 的扫描范围，直接在 spring 中指定一下 `auto.log.pointcut` 的属性值即可。\n\n### 测试例子\n\n\u003e [完整测试代码](https://github.com/houbb/auto-log/blob/master/auto-log-test/src/test/java/com/github/houbb/auto/log/dynamic/SpringDynamicServiceTest.java)\n\n我们在配置文件 `autoLogConfig.properties` 中自定义下包扫描的范围：\n\n```\nauto.log.pointcut=execution(* com.github.houbb.auto.log.test.dynamic.service.MyAddressService.*(..))\n```\n\n自定义测试 service\n\n```java\npackage com.github.houbb.auto.log.test.dynamic.service;\n\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class MyAddressService {\n\n    public String queryAddress(String id) {\n        return \"address-\" + id;\n    }\n\n}\n```\n\n自定义 spring 配置，指定我们定义的配置文件。springboot 啥的，可以直接放在 application.properties 中指定，此处仅作为演示。\n\n```java\n@Configurable\n@ComponentScan(basePackages = \"com.github.houbb.auto.log.test.dynamic.service\")\n@EnableAutoLog\n@PropertySource(\"classpath:autoLogConfig.properties\")\npublic class SpringDynamicConfig {\n}\n```\n\n测试\n\n```java\n@ContextConfiguration(classes = SpringDynamicConfig.class)\n@RunWith(SpringJUnit4ClassRunner.class)\npublic class SpringDynamicServiceTest {\n\n    @Autowired\n    private MyAddressService myAddressService;\n\n    @Autowired\n    private MyUserService myUserService;\n\n    @Test\n    public void queryUserTest() {\n        // 不会被日志拦截\n        myUserService.queryUser(\"1\");\n    }\n\n    @Test\n    public void queryAddressTest() {\n        // 会被日志拦截\n        myAddressService.queryAddress(\"1\");\n    }\n\n}\n```\n\n# springboot 整合使用\n\n## maven 引入\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.houbb\u003c/groupId\u003e\n    \u003cartifactId\u003eauto-log-springboot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e0.12.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n只需要引入 jar 即可，其他的什么都不用配置。\n\n使用方式和 spring 一致。\n\n## 测试\n\n```java\n@Autowired\nprivate UserService userService;\n\n@Test\npublic void queryLogTest() {\n    userService.query(\"spring-boot\");\n}\n```\n\n# 开源地址\n\n\u003e Github: [https://github.com/houbb/auto-log](https://github.com/houbb/auto-log)\n\n\u003e Gitee: [https://gitee.com/houbinbin/auto-log](https://gitee.com/houbinbin/auto-log)\n\n# Road-Map\n\n- [ ] distributed trace\n\n- [ ] 全局配置  比如全局的慢日志阈值设置等 参考 sandglass 中如何加载注解中的配置信息？（基于配置文件）\n\n- [x] 比例采样策略\n\n- [x] 自适应采样策略 \n\n- [x] 改进 interceptor 拦截器，类似 dubbo filter\n\n- [x] 优化日志中的方法路径名称\n\n- [ ] 编译时注解特性 类似 aspectj\n\n- [ ] 基于 agent 特性，类似 sky-walking\n\n---------------------------------------------------\n\n- [ ] 流程\n\n日志/trace 信息的生成\n\n采集\n\n存储\n\n检索/分析\n\n可视化\n\n# 开源矩阵\n\n| 编号 | 名称 | 简介 | 标签 |\n|:----|:----|:----|:----|\n| 1 | [sensitive](https://github.com/houbb/sensitive) | 基于注解的日志脱敏框架，更加优雅的日志打印 | 工具，日志 |\n| 2 | [auto-log](https://github.com/houbb/auto-log) | 日志自动输出 | 工具，日志 |\n| 3 | [heaven](https://github.com/houbb/heaven) | 收集开发中常用的工具类 | 工具 |\n| 4 | [resubmit](https://github.com/houbb/resubmit) | 防止重复提交框架 | 工具 |\n| 5 | [validator](https://github.com/houbb/validator) | 新一代校验框架 | 工具 |\n| 6 | [rate-limit](https://github.com/houbb/rate-limit) | 渐进式限流工具框架 | 工具 |\n| 7 | [lock](https://github.com/houbb/lock) | 开箱即用分布式锁 | 工具 |\n| 8 | [lombok-ex](https://github.com/houbb/lombok-ex) | 编译时注解框架，扩展 lombok | 工具 |\n| 9 | [csv](https://github.com/houbb/csv) | CSV的读写工具 | 工具 |\n| 10 | [iexcel](https://github.com/houbb/iexcel) | EXCEL的读写工具，避免OOM | 工具 |\n| 11 | [leetcode](https://github.com/houbb/leetcode) | 力扣算法个人学习笔记 | 学习 |\n| 12 | [awesome-metaverse-zh](https://github.com/houbb/awesome-metaverse-zh) | 元宇宙精选 | 学习 |\n| 13 | [rpc](https://github.com/houbb/rpc) | 手写rpc框架 | 学习,中间件 |\n| 14 | [mybatis](https://github.com/houbb/mybatis) | 手写mybatis框架 | 学习,中间件 |\n| 15 | [cache](https://github.com/houbb/cache) | 手写redis框架 | 学习,中间件 |\n| 16 | [mq](https://github.com/houbb/mq) | 手写mq框架 | 学习,中间件 |\n| 17 | [ioc](https://github.com/houbb/ioc) | 手写spring ioc框架 | 学习,中间件 |\n| 18 | [async](https://github.com/houbb/async) | 手写线程池异步框架 | 学习,中间件 |\n| 19 | [jdbc-pool](https://github.com/houbb/jdbc-pool) | 手写数据库连接池实现 | 学习,中间件 |\n| 20 | [sisyphus](https://github.com/houbb/sisyphus) | 支持注解的重试框架 | 学习,中间件 |\n| 21 | [sandglass](https://github.com/houbb/sandglass) | 任务调度时间框架 | 学习,中间件 |\n| 22 | [segment](https://github.com/houbb/segment) | 基于结巴的分词实现 | NLP |\n| 23 | [pinyin](https://github.com/houbb/pinyin) | 高性能中文转拼音工具 | NLP |\n| 24 | [opencc4j](https://github.com/houbb/opencc4j) | 中文繁简体转换 | NLP |\n| 25 | [word-checker](https://github.com/houbb/word-checker) | 中英文拼写检测 | NLP |\n| 26 | [sensitive-word](https://github.com/houbb/sensitive-word) | 敏感词 | NLP |\n| 27 | [nlp-hanzi-similar](https://github.com/houbb/nlp-hanzi-similar) | 汉字相似度 | NLP |\n| 28 | [word-cloud](https://github.com/houbb/word-cloud) | 好用的词云工具 | DOC |\n| 29 | [markdown-toc](https://github.com/houbb/markdown-toc) | 为文档生成目录 | DOC |\n| 30 | [idoc](https://github.com/houbb/idoc) | 项目自动生成文档 | DOC |\n| 31 | [metadata](https://github.com/houbb/metadata) | 数据库元数据表文档生成 | DOC |\n| 32 | [data-factory](https://github.com/houbb/data-factory) | 测试自动生成对象信息 | TEST |\n| 33 | [junitperf](https://github.com/houbb/junitperf) | 性能测试框架，测试报告生成 | TEST |\n| 34 | [houbb.github.io](https://github.com/houbb/houbb.github.io) | 个人博客 | 学习 |\n","funding_links":[],"categories":["测试"],"sub_categories":["客户端"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoubb%2Fauto-log","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhoubb%2Fauto-log","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoubb%2Fauto-log/lists"}