2

JAVA log日志系统

 2 years ago
source link: https://segmentfault.com/a/1190000040955275
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

JAVA log日志系统

发布于 今天 13:33

今天讲一下java的日志级别,非log4j/slf4j日志

Level描述OFF不打印任何SEVERE严重的错误WARNING潜在的问题警告INFO普通的信息CONFIG配置的信息,例如cpu信息,多少内存等FINE普通的开发人员信息FINER详细深入的开发人员系信息FINEST专业的开发人员信息ALL最低级别全部打印

日志级别打印

static Logger logger = LogManager.getLogManager().getLogger(Logger.GLOBAL_LOGGER_NAME);
    public static void main(String[] args) {
//        LogManager logManager = LogManager.getLogManager();
//        Logger logger = logManager.getLogger(Logger.GLOBAL_LOGGER_NAME);
        logger.log(Level.INFO,"My First log");
        logger.log(Level.INFO,"Another message");

        testLevel();

        logger.severe("oh no!");
        logger.info("Just info");
        logger.fine("He Developer dud");
    }

    public static void testLevel(){
        logger.setLevel(Level.INFO);
        logger.log(Level.SEVERE,"oh no!");
        logger.log(Level.INFO, "Just info");
        logger.log(Level.FINE,"He Developer dud");
        logger.log(Level.FINEST,"Secial developer");
    }
三月 02, 2020 11:49:09 下午 com.example.demo.pluralsight.log.LogTest main
信息: My First log
三月 02, 2020 11:49:09 下午 com.example.demo.pluralsight.log.LogTest main
信息: Another message
三月 02, 2020 11:49:09 下午 com.example.demo.pluralsight.log.LogTest testLevel
严重: oh no!
三月 02, 2020 11:49:09 下午 com.example.demo.pluralsight.log.LogTest testLevel
信息: Just info
三月 02, 2020 11:49:09 下午 com.example.demo.pluralsight.log.LogTest main
严重: oh no!
三月 02, 2020 11:49:09 下午 com.example.demo.pluralsight.log.LogTest main
信息: Just info

logp方法打印可以自定义类名以及方法

logger.logp(Level.INFO,"com.example.demo.pluralsight.log.LogTest1","main1","logp info");
三月 02, 2020 11:52:15 下午 com.example.demo.pluralsight.log.LogTest1 main1
信息: logp info

自定义handler

Handler h = new ConsoleHandler();
Formatter f = new SimpleFormatter();
h.setFormatter(f);
logger.addHandler(h);
logger.setLevel(Level.INFO);
logger.log(Level.INFO,"We're loging");
三月 04, 2020 12:26:10 上午 com.example.demo.pluralsight.log.LogTest handlerLogger
信息: We're loging
三月 04, 2020 12:26:10 上午 com.example.demo.pluralsight.log.LogTest handlerLogger
信息: We're loging

常用日志输出的handler:
ConsoleHandler,写入System.err输出到执行命令行窗口中。
StreamHandler,输出到OutputStream中
SocketHandler,输出到指定主机名和端口号的套接字中。
FileHandler,可以输出到单个文件中,也可输出到滚动文件集中(按照指定的大小,文件个数等滚动输出)。

其中FileHandler的Pattern

标识符描述/表示路径,windows下则为\,比如写为文件 ./foo.log%t表示系统的任何temp目录,%t/foo.log表示/var/tmp/foo.log或者C:\Users\Xuesong.bu\AppData\Local\Temp\foo.log%h用户的home目录,%h/foo.log表示/var/users/Xueosng.bu/foo.log或者C:\Users\Xuesong.Bu\foo.log%g循环写入的文件。foo_%g.log表示先写入foo_0.log当写满后再写入foo_1.log之后foo_2.log之后再清除foo_0.log,重新写入foo_0.log依次循环写入

滚动输出日志

public static void fileHandlerTest() throws Exception{
    FileHandler h = new FileHandler("%h/myapp_%g.log",1000,4);
    h.setFormatter(new SimpleFormatter());
    logger.addHandler(h);
    int i= 0 ;
    while(i<10000){
        logger.log(Level.INFO,"===============");
        i++;
    }
}

log的两种Formatter
XMLFormatter:格式化的XML,带有根元素,每个条目位于record的节点下面
SimpleFormatter:格式化简单文本,可以按照标准字符串的表示法进行格式化,

以下是一个标准的日志格式化输出的内容,其中5$代表Format中的message,2$表示source(class & method)

String.Format(format,date,source,logger,level,message,thrown);
通过java命令

java -Djava.util.logging.SimpleFormatter.format=%5$s,%2$s,%4$s%n com.example.demo.pluralsight.log.Main
输出日志
This is message,com.example.demo.pluralsight.log.LogTest Main,INFO

或者是直接通过修改日志默认配置文件,其中Handler可以分级,父级别子级分别输出,log.properties设置了两种handler,com.pluralsight和com.pluralsight.Main两种,一个为FileHandler另一个为ConsoleHandler,同class的包级别一样,com.plurasight是com.pluralsight.Main父级别handler

log.properties
java.util.logging.ConsoleHandler.level=INFO
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
com.pluralsight.handlers=java.util.logging.ConsoleHandler
com.pluralsight.level=INFO
java.util.logging.SimpleFormatter.format=%5$s,%2$s,%4$s%n
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.pattern=./main_%g.log
com.pluralsight.Main.handlers=java.util.logging.FileHandler
com.pluralsight.Main.level=ALL

通过下面的java -D来执行Main类,并输出如下结果

public class Main {
    public static void main(String[] args) {
        Logger loggerParent = Logger.getLogger("com.pluralsight");
        Logger logger = Logger.getLogger("com.pluralsight.Main");
        logger.log(Level.INFO,"We are logging");
        logger.log(Level.FINE,"We are logging fine");
    }
}

java -Djava.util.logging.config.file=log.properties com.example.demo.pluralsight.log.Main
输出结果:
We are logging,com.example.demo.pluralsight.log.Main main,信息

以及生成了main_0.log其中内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2020-03-05T16:37:44</date>
  <millis>1583397464390</millis>
  <sequence>0</sequence>
  <logger>com.pluralsight.Main</logger>
  <level>INFO</level>
  <class>com.example.demo.pluralsight.log.Main</class>
  <method>main</method>
  <thread>1</thread>
  <message>We are logging</message>
</record>
<record>
  <date>2020-03-05T16:37:44</date>
  <millis>1583397464400</millis>
  <sequence>1</sequence>
  <logger>com.pluralsight.Main</logger>
  <level>FINE</level>
  <class>com.example.demo.pluralsight.log.Main</class>
  <method>main</method>
  <thread>1</thread>
  <message>We are logging fine</message>
</record>
</log>

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK