自定义打印流或打印编写器,记录到每行的文件和前缀

时间:2015-05-01 12:11:24

标签: java logging

对于我的应用程序,我希望每个日志级别都有几个PrintStreamPrintWriter个实例,例如: INFODEBUGERROR等等。

给予流的文本应该是:

  • 到日志文件
  • 到系统输出

我想在所有行前加一个时间戳。 (我已经完成了获取时间戳字符串的代码)

还应该可以将此实例赋予异常:ex.printStackTrace( ApplicationLog.ERROR );

我已经尝试过扩展PrintWriter的课程:

package cf.randers.nev.log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

import cf.randers.nev.helper.LogHelper;

public  class CustomOutStream extends PrintWriter {

    public String loglevel;
    public boolean isBad;

    public CustomOutStream(String loglevel, File file, boolean isBad) throws FileNotFoundException {
        super(file);
        this.loglevel = loglevel;
        this.isBad = isBad;
        System.out.println("Created printstream: " + loglevel + " isBad: " + Boolean.toString(isBad));
    }

    @Override
    public void write(char[] buf, int off, int len) {

        String prefix = LogHelper.getCurrentTime();

        len = len + prefix.length() + this.loglevel.length();

        StringBuilder b = new StringBuilder(len);
        b.append(prefix);
        b.append(this.loglevel);
        b.append(buf);

        if (!this.isBad) {
            System.out.println(b.toString());
        } else {
            System.err.println(b.toString());
        }

        super.write(b.toString().toCharArray(), off, len);
    }

}

这不幸地不起作用。我对我的代码进行了一些调试,结果发现这个方法甚至没有被调用。

1 个答案:

答案 0 :(得分:1)

使用logback作为框架,设置执行该操作的记录器非常容易:

/src/main/java/(位于import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyClass { public static Logger LOGGER = LoggerFactory.getLogger(MyClass.class); public static void main(String[] args) { LOGGER.debug("Enter debug message here."); } }

logback.xml

/src/main/resources/(位于<configuration> <timestamp key="bySecond" datePattern="yyyy-MM-dd kk-mm-ss" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] [%-5level/%logger{36}] %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logs/log-${bySecond}.log</file> <append>false</append> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] [%-5level/%logger{36}] %msg%n</pattern> <immediateFlush>true</immediateFlush> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>

logs

此配置打印出{{1}}中记录到时间戳文件的所有内容,并很好地为所有消息添加前缀。