java中程序动态配置log4j日志

上一篇讲了如何配置log4j,但是都是固定的输出方式,如果我们想要动态的改变输入方式该怎么办呢?

比如我们有一个网络游戏在测试阶段,而这个游戏中玩家是以房间的形式组合在一起,这时我们如果想要测试房间内的逻辑是否正常,输出log的话都会存放在同一个日志文件内,如果遇到bug想要找起来非常困难,所以我们需要对每一个房间生成一个独立的log文件来进行保存。

代码:

    public static Logger getLoggerByName(String name,String type) {  
        // 创建logger,如果已存在则返回现有的
        Logger logger = Logger.getLogger(name);  
        // 清空Appender。
        logger.removeAllAppenders();  
        // log级别。  
        logger.setLevel(Level.DEBUG);  
        
        // 生成新的Appender  
        FileAppender appender = new RollingFileAppender();  
        PatternLayout layout = new PatternLayout();  
        // log的输出形式  
		//        %c - the category 类
		//        %d - the date 日期
		//        Date format: The date format character may be followed by a date format specifier enclosed between braces. For example, %d{%H:%M:%S,%l} or %d{%d %m %Y %H:%M:%S,%l}. If no date format specifier is given then the following format is used: "Wed Jan 02 02:03:55 1980". The date format specifier admits the same syntax as the ANSI C function strftime, with 1 addition. The addition is the specifier %l for milliseconds, padded with zeros to make 3 digits.
		//        %m - the message 消息
		//        %n - the platform specific line separator 换行
		//        %p - the priority 优先级
		//        %r - milliseconds since this layout was created. 从创建到现在的毫秒数
		//        %R - seconds since Jan 1, 1970 时间戳
		//        %u - clock ticks since process start 进程开始到现在的时间
		//        %x - the NDC
        String conversionPattern = "%m%n";  
        
        layout.setConversionPattern(conversionPattern);  
        appender.setLayout(layout);  
        // log输出路径  

        appender.setFile( "./log/" + type + "/" + name + ".log");  
        // log的文字码  
        appender.setEncoding("UTF-8");  
        // true:在已存在log文件后面追加 false:新log覆盖以前的log  
        appender.setAppend(true);  
        // 适用当前配置  
        appender.activateOptions();  
        // 将新的Appender加到Logger中  
        logger.addAppender(appender);  
        return logger;  
    } 

该方法2个参数:name 为文件名,type为log下的文件夹名。

测试一下:

	 public static void main( String[] args )
	 {
		 Logger test1 = getLoggerByName("test1", "room");
		 test1.info("test1 msg1");
		 test1.info("test1 msg2");
		 test1.info("test1 msg3");

		 Logger test2 = getLoggerByName("test2", "room");
		 test2.info("test2 msg1");
		 test2.info("test2 msg2");
		 test2.info("test2 msg3");
	 }
运行程序后,我们可以在控制台看到输出:


并且可以在log文件夹中看到日志文件:


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
anylog 是一个可以在代码的任意区域无入侵地加入日志的工具,适用于线上问题排查。 anylog 为开发人员提供一个易于使用的平台,帮助开发人员在正在运行的系统随时加入自己想要的日志,而免于修改代码和重启。 使用场景举例     1、一些同学在写代码时,把异常吃掉了,使得问题难以查找,可以使用这个工具,动态打印出被吃掉         的异常,而不用停机。     2、一些项目依赖第三方jar包,如果发生问题,但第三方包日志打印,以往可能需要重新编译第         三方包,加上日志,重启服务,然后排查问题。但使用这个工具,就可以直接动态加入日志,而不用         修改第三方jar包,也不用重启。 已有功能     1、让系统打印某个exception的堆栈,无论此exception是否已经被吃掉都可打印     2、在某个指定类的某个方法的某一行,输出日志。     3、在某个指定类的某个方法的开始,输出日志。     4、在某个指定类的某个方法的结束,输出日志。       5、打印方法耗时,支持方法嵌套。     如果需要扩展新的功能(例如输出jvm的cpu占用,内存大小等),只需要实现spi的     com.github.jobop.anylog.spi.TransformDescriptor      和com.github.jobop.anylog.spi.TransformHandler接口,     然后把实现的jar包放到providers目录即可识别。 使用方法     1、获取运行程序:         1)可以到以下地址获取正式发行版:https://github.com/jobop/release/tree/master/anylog         2)你也可以clone下源码后,执行如下命令,生成运行程序,生成的运行程序将在dist目录下             生成windows版本:  mvn install             生成linux版本:  mvn install -Plinux     2、直接执行startup.bat或者startup.sh即可运行起来     3、访问 http://127.0.0.1:52808 即可使用 功能扩展     anylog利用spi机制实现其扩展,如果你想要对anylog增加新的功能(例如添加返回值打印的功能)可以按照如下步骤操作:     1、使用如下命令,生成一个spi实现工程,并导入eclipse     mvn archetype:generate -DarchetypeGroupId=com.github.jobop -DarchetypeArtifactId=anylogspi-archetype -DarchetypeVersion=1.0.4     2、参照该工程已有的两个例子(一个是在方法开始插入日志,一个是在方法结束插入日志),实现TransformDescriptor和TransformHandler接口     3、把两个接口实现类的全路径,分别加到以下两个文件         src/main/resources/META-INF/services/com.github.jobop.anylog.spi.TransformDescriptor         src/main/resources/META-INF/services/com.github.jobop.anylog.spi.TransformHandler     4、执行mvn install打包,在dist下会生成你的扩展实现jar。     5、把扩展实现jar拷贝到anylog的providers目录下,重启即可生效。     tips:在实现spi时,我们提供了SpiDesc注解,该注解作用在你实现的TransformDescriptor上,可以用来生成功能描述文字。          如果要深入了解spi机制,请自行google:java spi 标签:anylog
Log4j是Java常用的日志框架之一,它可以帮助我们记录应用程序运行时的信息。在Java项目使用Log4j,需要进行以下配置: 1. 在项目添加Log4j的jar包,可以通过Maven或手动添加的方式进行。 2. 创建log4j.properties文件,该文件是Log4j的配置文件,用于定义日志输出方式和格式等信息,以下是一个示例log4j.properties配置文件: ``` # 设置日志级别为DEBUG log4j.rootLogger=DEBUG, stdout # 输出到控制台 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # 设置日志输出格式 log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - %m%n ``` 3. 在代码使用Log4j输出日志,例如: ```java import org.apache.log4j.Logger; public class MyApp { private static final Logger logger = Logger.getLogger(MyApp.class); public static void main(String[] args) { logger.debug("debug message"); logger.info("info message"); logger.warn("warning message"); logger.error("error message"); logger.fatal("fatal message"); } } ``` 在以上示例,我们通过Logger.getLogger方法获取Logger实例,并在代码输出了不同级别的日志信息。如果我们想要输出指定级别的日志,可以在log4j.properties文件设置相应的日志级别。 以上就是Java使用Log4j的基本配置方法。需要注意的是,Log4j也支持通过XML或YAML文件进行配置,可以根据实际需求选择不同的配置方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值