网元日志的特点是:每个网元的日志要写在单独的文件中,文件名要能够唯一地确定一组“用户-网元”连接,因此不可能预先指定或者写在配置文件里,只能在运行时根据登录的用户名和连接网元的ID动态生成。
使用JDK原生的java.io.FileOutputStream等类可以达到上述目的,但文件的关闭比较麻烦,由于JVM垃圾回收的特点,日志包装类被回收的时间是不确定的,如果它被回收的比较慢,文件句柄就不会被关闭,导致系统资源消耗变大。
下面的代码基于Logback实现了运行时动态指定日志文件名的日志工具,并发500个线程写日志文件,大约耗时3s左右。
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
public class DynamicLogWriter {
private String loggerName = null;
private final Logger logbackLogger;
public DynamicLogWriter(String logfileName) {
loggerName = logfileName;
LoggerContext loggerContext = new LoggerContext();
FileAppender
参考: http://stackoverflow.com/questions/7824620/logback-set-log-file-name-programatically