slf4j初步使用之以当前登录用户命名文件名

    slf4j(simple logging facade for java)是Java的简单的日志门面,它不是具体的日志解决方案,它只服务于各种各样 slf4j-logo的日志系统。

    实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算用那个具体的日志系统。只需要在项目中加入定的slf4j-logo.jar包就可以。这个和Spring的IOC思想有点像,想用哪个就用哪个,随意切换。

    使用slf4j这种记录日志的方式的特点很明显:1、如果我们需要记录的是底层类库或者组件这种东西,就可以不影响或强制要求用户选择哪种日志系统。2、如果我们用特定的日志系统写了代码,但是有一天要求换另一种日志系统,如果之前就用slf4j的api写的,那就很简单,但是如果用具体的一种方式写了以后,那在切换就很麻烦。

   SLF4J一般都是和logback.xml配合使用的,那我们来看看最基本的logback配置

  

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread] %class:%line >>
                %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread] %class:%line >>
                %msg%n
            </pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </layout>
    </appender>

    <appender name="sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/opt/logs/insurance/infoInsure_sql.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>/opt/logs/insurance/infoInsure.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>%date{yyyy-MM-dd HH:mm:ss}[%level][%thread][%logger:%line]-%mdc{client} %msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/opt/logs/insurance/infoInsure.log</file><!-- /opt/logs/settle.log -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>/opt/logs/insurance/infoInsure.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <encoder>
            <Pattern>%date{yyyy-MM-dd HH:mm:ss}[%level][%thread][%logger:%line]-%mdc{client} %msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/opt/logs/insurance/errorInsure.log</file><!-- /opt/logs/settle.log -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>/opt/logs/insurance/errorInsure.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <Pattern>%date{yyyy-MM-dd HH:mm:ss}[%level][%thread][%logger:%line]-%mdc{client} %msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <logger name="com.noah.order.common.dao.mapper" level="debug" additivity="true">

        <appender-ref ref="sql"/>
    </logger>

    <root level="trace">
        <appender-ref ref="infoFile"/>
        <appender-ref ref="errorFile"/>
        <appender-ref ref="stdout"/>
    </root>
</configuration>

以上配置信息中,我们只是控制输出了级别日志,像INFO,ERROR,WARING,当然,我们要做其他的操作就需要继续添加appender。

例如我们现在有一个需求,是需要生成登录用户自己的文件夹,方便开发员管理日志,那么我们就可以使用slf4j里的MDC实现。

当log使用了最外层的appender时可以使用mdc将一些值放在容器里,然后嵌套的那个appender就可以使用这个容器的值。下面来看具体代码的实现


SLF4J使用步骤

1》、在pom.xml内引入slf4j的jar包,和logback的包

<dependency>
    	<groupId>ch.qos.logback</groupId>
    	<artifactId>logback-classic</artifactId>
    	<version>1.1.3</version>
	</dependency>
	<dependency>
    	<groupId>ch.qos.logback</groupId>
    	<artifactId>logback-access</artifactId>
    	<version>1.1.3</version>
	</dependency>
	<dependency>
    	<groupId>ch.qos.logback</groupId>
    	<artifactId>logback-core</artifactId>
   	 	<version>1.1.3</version>
	</dependency>
	<dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>slf4j-api</artifactId>
    	<version>1.7.12</version>
	</dependency>
2》、在resource下新建logback.xml文件,最基本的配置我在上面已经贴出,这里就不重复了,我们具体来看我们要实现的

<appender name="LoginInfoFile" class="ch.qos.logback.classic.sift.SiftingAppender">  
        <discriminator>
        	<key>account</key>
        	<defaultValue>unknown</defaultValue>
        </discriminator>
        <sift>
        	<appender name="FILE_{account}" class="ch.qos.logback.core.FileAppender">
        		<file>${LOG_HOME}/${account}/login.log</file>
        		<append>true</append>
        		<layout class="ch.qos.logback.classic.PatternLayout">
        			<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>  
        		</layout>
        	</appender>
        </sift>
    </appender>  

我们在一个appender里面嵌套了一个appender,主要实现的是我们在discriminator里的key,这个key是MDC里面的键值映射的键,那么我们在file里配置日志存放路径时,就可以使用变量形式来使用这个key的值了。我们在要打印日志类中,得到appender的name

private static final Logger login=LoggerFactory.getLogger("LoginInfoFile");
在需要输出日志的方法中,把我们登录的对象存进MDC中

MDC.put("account", gymOwner.getAccount());

然后输出日志

login.info("当前登录用户:"+gymOwner.getAccount());
		login.info("登录时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

我们还需要声明logger,不然是不起作用的

<logger name="LoginInfoFile" level="INFO" additivity="true">
     	<appender-ref ref="LoginInfoFile"></appender-ref>
</logger>
如果还要写其他相关 类的日志,只要在多写几个appender,然后把名字修改就可以了

执行完项目后现在我们在指定的路径内,就可以看到我们的日志文件了



这样按照用户生成的日志文件夹就实现了,是不是很容易呢




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值