乐趣区

关于java:JAVA-log日志系统

明天讲一下 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>
退出移动版