前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >slf4j 搭配 log4j2 处理日志

slf4j 搭配 log4j2 处理日志

作者头像
海向
发布2019-09-23 14:54:57
8410
发布2019-09-23 14:54:57
举报
文章被收录于专栏:海向海向

目录


关于 log4j

Log4j + Slf4j 的使用组合最为常见,但是我们知道 Log4j 目前已经停止更新了。Apache推出了新的 Log4j2 来代替 Log4j,Log4j2 是对Log4j 的升级,与其前身 Log4j 相比有了显着的改进,并提供了许多 Logback 可用的改进,同时解决了 Logback 体系结构中的一些固有问题。因此,Log4j2 + Slf4j 应该是未来的大势所趋。

关于 slf4j

  1. LF4J不同于其他日志类库,与其它日志类库有很大的不同。SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库。
  2. 如果一个项目已经使用了log4j,而你加载了一个类库,比方说 Apache Active MQ——它依赖于于另外一个日志类库 logback,那么你就需要把它也加载进去。但如果 Apache Active MQ 使用了 SLF4J,你可以继续使用你的日志类库而无需忍受加载和维护一个新的日志框架的痛苦。
  3. 总的来说,SLF4J使你的代码独立于任意一个特定的日志API,这是对于 API 开发者的很好的思想。虽然抽象日志类库的思想已经不是新鲜的事物,而且 Apache commons logging 也已经在使用这种思想了,但 SLF4J 正迅速成为Java世界的日志标准。

案例使用

引入 slf4j 和 log4j2 的核心包

代码语言:javascript
复制
<!-- slf4j核心包-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.25</version>
    <scope>runtime</scope>
</dependency>

<!--log4j2核心包-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.8.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.8.2</version>
    <scope>runtime</scope>
</dependency>

<!--log4j2 异步依赖-->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.6</version>
</dependency>

log4j2.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="off" monitorInterval="120">
    <properties>
        <property name="LOG_HOME">/mytest_log</property>
    </properties>
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <!--RollingFile 为全局同步 RandomAccessFile 为异步-->
        <RollingRandomAccessFile name="rootAppeder"
                                 fileName="${LOG_HOME}/rattanapi.log"
                                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/rattanapi-root-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %ex%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingRandomAccessFile>

        <!--错误日志输出-->
        <RollingRandomAccessFile name="errorAppeder"
                                 fileName="${LOG_HOME}/rattanapi-error.log"
                                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/rattanapi-error-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %ex%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingRandomAccessFile>

    </appenders>

    <loggers>
        <asyncRoot level="info">
            <!--根据配置文件是否打开 console输出 -->
            <appender-ref ref="Console"/>
            <appender-ref ref="rootAppeder"/>
            <appender-ref ref="errorAppeder"/>
        </asyncRoot>
    </loggers>
</configuration>

web.xml中设置log4j2的监听器和过滤器(servlet3.0及以上版本不需要该步操作)开发Servlet3.0的程序需要一定的环境支持。

代码语言:javascript
复制
<!--对于log4j2,Servlet2.5以前的版本需要-->
   <listener>
      <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
   </listener>
   <filter>
      <filter-name>log4jServletFilter</filter-name>
      <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
   </filter>
<filter-mapping>
      <filter-name>log4jServletFilter</filter-name>
      <url-pattern>/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
      <dispatcher>INCLUDE</dispatcher>
      <dispatcher>ERROR</dispatcher>
 </filter-mapping>

注意:log4j2不再支持properties文件了,只支持xml,json或是yaml,不指定位置的情况下默认在src/main/resources下查找。

如果需要自定义位置,需要在上面的web.xml中添加以下代码

代码语言:javascript
复制
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>classpath:log4j2.xml</param-value>
</context-param>
代码语言:javascript
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
    String world = "world";
    logger.info("hellp world:{}",world);
    logger.error("exception e");
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于 log4j
  • 关于 slf4j
  • 案例使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档