我的第二个开源项目wxLog

in 开源 with 0 comment

项目地址

github:https://github.com/wirechen/wxLog
gitee:https://gitee.com/wirechen/wxLog

背景

PM:这期的活动项目当用户参与人数达到250人的时候麻烦通知我一下,我要看下效果决定是否群发推送或者下掉活动。
我:为啥非得是250人?
PM:图个吉利。
我:额,一定要刚好250吗?
PM:是的,拜托了开发爸爸。

既然产品都叫爸爸了,咱们也不好拒绝啊不是?但是咱也不能上线后一直盯着生产数据看啊,em....这是个问题....

好吧,以上都是我YY的,言归正传。我们平时在业务开发中,除了上面的应用场景还有很多,如:对接三方接口服务出错、阈值触发、异常请求等业务相关需要报警的场景有很多。干脆索性就想搞一个能在生活中任何时候实时主动通知我的玩意儿,短信?电话?但要成本啊,就想到我们每天都不离手的微信。然后通知的方式既不想对代码有太大的侵入性,又想实现起来简单优雅,还想要兼容以前的代码,于是想到了日志框架打日志的方式。于是,weixin+ log = wxLog 诞生了!

快速体验

  1. 克隆项目到自己本地
    git clone https://github.com/wirechen/wxLog.git

  2. 获取openid
    关注微信公众号【wirechen】,点击【微信报警】在子栏目选择【openid】即可获取。

  1. 修改log4j.xml配置文件,在openIds一栏输入添加自己的openid
  1. 运行Test中的main方法
  1. 成功接收到微信报警

日志历史梳理

说实话,开发wxLog之前我对SLF4j、log4j、log4j-core、log4j-api、logback、Java Util Logging、commons-logging等等各种日志框架之间的关系是懵逼的,相信也有部分开发同学还是不太清楚,请允许我装个B,在这里简单梳理一下。如果对这日志发展史比较熟悉的同学,可以直接看接入教程

以Log4j为发展主线,简单划分Log4j为四个时代:

Log4j盛行时代一一Log4j一枝独秀

在这个时代,如果你想使用Log4j只需要简单引入单独的Log4j的jar包即可:
image.png

Log4j中期时代一一JCL作为日志门面

在这个时代,由于commons-logging的加入,所以还得引入该日志门面的jar包:
image

Log4j衰落时代一一SLF4j作为日志门面

在这个时代,大势所趋之下Log4j不得不抛弃它亲生的commons-logging日志门面,去投靠SLF4j,但必须引入桥接包去适配SLF4j:
image.png

Log4j最后的反击一一log4j-api作为日志门面

Log4j2虽然和Log4j是同门师兄弟,但完全合不来,依赖也需要桥接包。但log4j-api更恶心的是:你想要适配我,必须要通过我的日志实现log4j-core。哪怕是师弟Log4j也不例外,当然桥接包也不能少。
image.png

总结

上面以Log4j为线索简单讲解了下Log4j的发展历程,为了可以看起来不那么枯燥,写得略微诙谐幽默,增强可读性和记忆性,但比较肤浅也遗漏了许多,比如日志门面之间的桥接等。Java日志框架的发展史非常繁杂,如果感兴趣的同学可以参考下面的两篇博客:礼炮1空间站imango

最后,

其他同学:卧槽???你咋不早说!

其他同学:继续,看着你装X。

接入wxLog到你的项目

1. 引入wxLog依赖

目前已上传至maven中央仓库,但阿里云镜像还未同步过去,我也不知道为啥,知道的同学可以告诉我一下。如果不能下载jar包请切换源为中央仓库。

<dependency>
   <groupId>com.github.wirechen</groupId>
   <artifactId>wxLog</artifactId>
   <version>1.0.RELEASE</version>
</dependency>

ps:如果自己项目中的Log4j和wxLog里面的Log4j版本不同,可以exclusion掉,httpclient同理。

2. 添加配置

在Log4j日志配置文件添加WxAppender并引入到Root

xml格式

<appender name="WxAppender" class="com.github.wirechen.WxAppender">
    <!-- 必填项:openIds添加参考快速体验-步骤2,多个可以用英文逗号分割 -->
    <param name="openIds" value="xxx"/>
    <!-- 非必填项 -->
    <filter class="com.github.wirechen.WxFilter">
	<!-- 过滤包名:只有该包下的日志才能触发报警 -->
	<param name="packageToMatch" value="com.xxx"/>
	<!-- 过滤日志开头:以特定内容开头的日志才能触发报警 -->
	<param name="stringToMatch" value="【微信报警】"/>
	<!-- 过滤日志等级:有levelMin和levelMax,可自行调节,默认只有WARN级别日志才会触发报警 -->
        <param name="levelMax" value="WARN"/>
    </filter>
</appender>

properties格式

log4j.appender.WxAppender=com.github.wirechen.WxAppender
log4j.appender.WxAppender.openIds=xxxx
log4j.appender.WxAppender.filter=com.github.wirechen.WxFilter
log4j.appender.WxAppender.filter.packageToMatch=com.xxx
log4j.appender.WxAppender.filter.levelMax=WARN
<root>
    <level value="INFO"/>
    <appender-ref ref="stdout"/>
    <appender-ref ref="FILE"/>
    <!-- 把WxAppender加进来 -->
    <appender-ref ref="WxAppender"/>
</root>

3. 应用测试

直接在Java代码中打日志:log.warn("【微信报警】巴拉巴拉...")

如果没有收到微信报警推送,可以:

  1. 请回看日志历史梳理检查自己属于哪个“时代”,不要搞半天发现不是用的Log4j。
  2. 检查是否符合过滤条件。
  3. 在公众号留言联系作者。

4. 项目实战分享