【Netty4 简单项目实践】四、添加Log工具-SL4J

现在再给工程添加Log

听说SL4J比Log4J要好,只是听说Log4J会消耗更多的文件描述符,在负载大的时候会让系统响应拖慢,因为是简单工程项目也就不对比实际的效果了。

注册Log4J

SL4J只是上层接口,还是需要依托于某种Logger,选择Log4J

下载三个包 log4j-1.2.17.jar slf4j-api-1.7.21.jar slf4j-log4j12-1.7.21.jar, maven的话在maven仓库都有,不再提了。

然后在src目录下放置log4j.properties文件配置log4j

log4j.properties

#设置等级和Appender
log4j.rootLogger=debug,consoleAppender,fileAppender
log4j.category.ETTAppLogger=debug, ettAppLogFile

#级别
#ALL TRACE DEBUG INFO WARN ERROR FATAL OFF
#org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
#org.apache.log4j.ConsoleAppender (控制台)
#org.apache.log4j.FileAppender (文件)
#org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
#org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)

#控制台输出的logger
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold=OFF
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss SSS} ->[%t]--[%-5p]--[%c{1}]--%m%n

#文件输出logger
log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileAppender.File=./log/debug.log
log4j.appender.fileAppender.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.fileAppender.Threshold=DEBUG
log4j.appender.appender2.MaxFileSize=10MB
log4j.appender.fileAppender.Encoding=UTF8
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss SSS}-->[%t]--[%-5p]--[%c{1}]--%m%n

#每天输出Info级别
log4j.appender.ettAppLogFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ettAppLogFile.File=./log/daily_info.log
log4j.appender.ettAppLogFile.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.appender2.MaxFileSize=10MB
log4j.appender.ettAppLogFile.Threshold=INFO
log4j.appender.ettAppLogFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ettAppLogFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss SSS}-->[%t]--[%-5p]--[%c{1}]--%m%n

部署SL4J

有两个地方需要设置:
在程序入口处要加上 

public staticvoid main(String[]argv)throws Exception{

        InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());

        //启动代码

}


本身Netty是自带Log功能的,如果想捕获这些内部Log,需要在ChannelInitializer<Channel>的初始化代码当中添加一个Logg处理器

new ChannelInitializer<Channel>() {

                    @Override

                    protected void initChannel(Channel ch) throws Exception {

                        // TODO Auto-generated method stub

                        ChannelPipeline pipeline =ch.pipeline();

                        pipeline.addLast("logging",new LoggingHandler(LogLevel.WARN));


一定要挂在第一个位置上,这样就好了。

这里指定的LogLevel.WARN是指Netty的内部log将标记为WARN


使用Logger

在每个类中添加这样的代码,一般我们就加在处理器里面了,业务Model里面也加上

<span style="font-size:14px;">import io.netty.util.internal.logging.InternalLogger;

public class HttpUploadServerHandler extends SimpleChannelInboundHandler<HttpObject> {
    private static final InternalLogger log =InternalLoggerFactory.getInstance(HttpUploadServerHandler.class);
          // 业务代码
}</span>


在业务代码中用

log.debug("debug");

这种形式打log即可。

也可以使用一个帮助类记录业务关键数据,比如
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;

public class MyLogger {
    private static final InternalLogger log =InternalLoggerFactory.getInstance(MyLogger.class);
    
    public static void log(String msg) {
        msg = "[APP]["+System.currentTimeMillis() + "]: " + msg;
        String model = Property.getProperty("debugModel");
        if (model.equals("debug")){
            System.out.println(msg);
        } else if (model.equals("product")) {
            log.warn(msg);
        }
    }
}



你可能感兴趣的:(【Netty4 简单项目实践】四、添加Log工具-SL4J)