Заметки Log4j

Apache Log4j

Log4j кажется устаревшим, зачем писать эту статью?

Реализация log4j, log4j2 и logback по основным идеям одинаковая, это не что иное, как вывод контента в файл, да и конфигурационные файлы тоже похожи (логгер, аппендер, лейаут), но у последних двух больше продвинутый, чем прежний.Функция этого блока может выполняться отдельно. Так что если хотите понять суть, лучше начать с самой первой версии.

Простой опыт

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

Тестовый класс:

public static void main(String[] args) {
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.debug("log4j debug");
    logger.info("log4j info");
    logger.error("log4j error");
}

Вывод в консоль: log4j.properties

# 定义一个名为 csAppender 的日志附加器
log4j.appender.csAppender=org.apache.log4j.ConsoleAppender
log4j.appender.csAppender.Threshold=INFO
log4j.appender.csAppender.Target=System.out
log4j.appender.csAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.csAppender.layout.ConversionPattern=[%d] [%t] [%c.%M:%L] [%-5p]: %m%n

# 配置根日志级别为 debug,并设置输出器为刚定义的 csAppender
log4j.rootLogger=debug,csAppender

Вывод в файл: log4j.properties

# 定义一个名为 fileAppender 的日志附加器
log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileAppender.Threshold=INFO
log4j.appender.fileAppender.File=D://data//usr//local//logs//home//log4j-log.log
log4j.appender.fileAppender.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.fileAppender.Encoding=UTF-8
log4j.appender.fileAppender.Append=true
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=[%d] [%t] [%-5p] [%c.%M:%L]: %m%n
# 配置根日志级别为 debug,并设置输出器为刚定义的 fileAppender
log4j.rootLogger=debug,fileAppender

Экземпляр корневого журнала в приведенном выше примере конфигурации использует приложения csAppender (консоль) и fileAppender (файл) соответственно для вывода содержимого журнала в место назначения. Конечно, он также может быть выведен одновременно. Официальный сайт log4j не объясняет конфигурацию, но вorg.apache.log4j.PropertyConfigurator#doConfigureПолное описание можно найти в примечаниях к методу.

Первым шагом является настройка формата корневого регистратора следующим образом:

log4j.rootLogger = [level] , appenderName1, appenderName2, …
  • levelУстановите минимальный уровень ведения журнала.Значения, которые можно установить: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL или пользовательский уровень. Например, если здесь установлен уровень INFO, регистрируются все уровни DEBUG Приложение будет настроено, информация не будет распечатана.

  • appenderName

    Он указывает, куда должна выводиться информация журнала. Одновременно можно указать несколько выходных адресатов, разделенных запятыми. Например: log4j.rootLogger=INFO,A1,B2,C3

Второй шаг — настроить формат назначения вывода информации журнала (добавление) следующим образом:

# For appender named
log4j.appender.appenderName=fully.qualified.name.of.appender.class
# Set appender specific options.
log4j.appender.appenderName.option1=value1
...
log4j.appender.appenderName.optionN=valueN

Три компонента

Log4j has three main components: loggers, appenders and layouts. These three types of components work together to enable developers to log messages according to message type and level, and to control at runtime how these messages are formatted and where they are reported.

Log4j имеет три основных компонента: Loggers (регистраторы), Appenders (источники вывода) и Layouts (макеты). Это можно просто понять как категорию журнала, где журнал должен быть выведен и в какой форме выводится журнал. Совместное использование этих трех компонентов позволяет легко регистрировать тип и уровень информации, а также управлять стилем и расположением вывода журнала во время выполнения.

Logger

В этой системе компонент Loggers разделен на пять уровней: DEBUG, INFO, WARN, ERROR и FATAL. Пять уровней в порядке,DEBUG < INFO < WARN < ERROR < FATAL, соответственно, используемые для указания важности этой информации журнала. Log4j имеет правило:Выводить только информацию журнала, уровень которой не ниже установленного уровня. Предполагая, что уровень Loggers установлен на INFO, информация журнала уровней INFO, WARN, ERROR и FATAL будет выводиться, в то время как уровень DEBUG ниже INFO не будет выводиться.

определить регистратор

В Log4J всегда естьrootLogger, существует, даже если конфигурация не отображается, а выходной уровень по умолчаниюDEBUG. разноевсе регистраторы наследуются от этого rootLogger(если другие регистраторы не определяют свои выходные уровни индивидуально).

Во-вторых, иерархия в Log4J (Hierarchy) используется'.'отделяться, напримерlog4j.logger.com.example.test, это не означает, что за log4j.logger должно следовать конкретное имя пакета или даже имя класса. Это имя можно настроить. Мы даже можем определить log4j.logger.ABC Как показано в следующем примере, три экземпляра регистратора созданы, которыеA,A.B,A.B.C

## log4j.properties
log4j.logger.A.B.C = ERROR,appenderName
## 在代码中获取名为 A.B 的日志对象
Logger logger = Logger.getLogger("A.B")

Когда требуемый в данный момент регистратор не может быть получен, действие поиска будет передано, и экземпляр корневого регистратора будет возвращен до тех пор, пока корневой узел не найдет регистратор с соответствующим именем.

Appender

Each enabled logging request for a given logger will be forwarded to all the appenders in that logger as well as the appenders higher in the hierarchy

Это предложение на официальном сайте log4j означает, что объекты логгера могут наследоваться, а аппендеры могут накапливаться. Когда объект логгера более низкого уровня вызывается для вывода журнала, log4j выводит запрос на все приложения, в настоящее время подключенные к этому логгеру.

Предположим, что существуют следующие файлы конфигурации:

log4j.rootLogger=DEBUG,consoleAppender

log4j.logger.com=DEBUG,consoleAppender
log4j.logger.com.A.B=INFO,consoleAppender
log4j.logger.com.X=INFO,consoleAppender

## ... 省略 consoleAppender 配置

Затем в контейнере журнала log4j существует следующая связь экземпляра:

Вывод журнала регистратора с именем AB будет выведен на консоль три раза. Причина в том, что AB наследует все приложения A и родительского регистратора A. Это отношение наследования предназначено только для добавления приложения родительского регистратора к его собственному добавлению. Уровень выходных данных родительского регистратора не влияет на выходные данные дочернего регистратора.

log4j.rootLogger=DEBUG,consoleAppender
log4j.logger.A=DEBUG,consoleAppender
log4j.logger.A.B=INFO,consoleAppender
log4j.additivity.A.B=false

Журнал регистратора с именем A.B будет выводиться только в его собственное приложение и не будет наследовать приложение какого-либо родительского регистратора.

Если вы хотите ограничить вывод уровня журнала приложением, вам нужно использовать порог для управления им.

log4j.threshold=ERROR

Он используется для управления всеми аппендерами, то есть вывод логов на все аппендеры, независимо от исходного уровня, не может быть ниже уровня, заданного порогом.

log4j.appender.Console.threshold=ERROR 

Используется для управления выходным уровнем указанного приложения.

Система ведения журнала Log4j также предоставляет множество мощных функций, таких как возможность вывода журналов в разные места, такие как консоль (Console), файлы (Files) и т. д., может создавать новые файлы в зависимости от количества дней или размера файла. , а можно отправлять в виде потока в другие места и так далее.

приставка

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout

лог-файл (logFile)

log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout

Откат файла (rollingFile)

  • Threshold=WARN: указывает минимальный уровень вывода информации журнала, по умолчанию DEBUG.
  • ImmediateFlush=true: указывает, что все сообщения будут выводиться немедленно. Если установлено значение false, они не будут выводиться. Значение по умолчанию — true.
  • Append=false: true означает, что сообщение добавляется в указанный файл, false означает, что сообщение перезапишет содержимое указанного файла, значение по умолчанию — true.
  • File=D:/logs/logging.log4j: указывает, что сообщения выводятся в файл logging.log4j.
  • MaxFileSize=100KB: суффикс может быть KB, MB или GB. Когда файл журнала достигает этого размера, он автоматически прокручивается, то есть исходное содержимое перемещается в файл logging.log4j.1.
  • MaxBackupIndex=2: указывает максимальное количество генерируемых файлов.Например, если установлено значение 2, могут быть созданы два скользящих файла logging.log4j.1, logging.log4j.2 и один файл logging.log4j.
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout

Периодически откатывайте файл журнала (dailyFile)

DatePattern='.'yyyy-MM: каждый месяц создается новый файл журнала. Имя файла журнала для текущего месяца — logging.log4j, а имя файла журнала для предыдущего месяца — logging.log4j.yyyy-MM. Кроме того, вы также можете указать прокрутку файла журнала по неделям, дням, часам, минутам и т. д. Соответствующий формат выглядит следующим образом:

- yyyy-MM:每月
- yyyy-ww:每周
- yyyy-MM-dd:每天
- yyyy-MM-dd-a:每天两次
- yyyy-MM-dd-HH:每小时
- yyyy-MM-dd-HH-mm:每分钟
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout

применить к сокету

log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true

Отправить журнал на указанный адрес электронной почты

log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout

применяется к базе данных

log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout

Layout

Иногда пользователи хотят отформатировать вывод журнала в соответствии со своими предпочтениями.Log4j может добавлять макеты после Appenders для выполнения этой функции. Макеты предоставляют четыре стиля вывода журнала, такие как стиль HTML, свободно заданный стиль, стиль, содержащий уровень журнала и информацию, и стиль, содержащий время журнала, поток, категорию и другую информацию. Обычно используются следующие классы:

- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)

Символ форматирования Описание

%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
%t:输出产生该日志事件的线程名。
%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:输出日志信息所属的类目,通常就是所在类的全名。
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L::输出代码中的行号。
%m::输出代码中指定的具体日志信息。
%n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
2)%-20c:"-"号表示左对齐。
3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

Фактический анализ

Определите два приложения для вывода на консоль и файл, соответственно, для файлов с именемcom.fingard.rh.rhf.ryb.manager.UnifiedServiceManagerУровень вывода журнала настроен на ERROR, а наследование аппендикса отключено, выводится только в аппендере текущего логгера. в классеUnifiedServiceManagerЕсли вы используете следующий метод для получения журнала, журнал будет выводиться только на уровне ERROR и выше.

Logger logger1 = Logger.getLogger(UnifiedServiceManager.class)

анализироватьLogger getLogger(Class clazz)Исходный код известен,По умолчанию в качестве loggerName используется полный путь к классу.. Следовательно, полученный logger1 — это имя, указанное в файле конфигурации.com.fingard.rh.rhf.ryb.manager.UnifiedServiceManagerобъект журнала.

навыки и умения

Определите переменные в файле конфигурации .properties

LOG_HOME=D://data//usr//local//logs//home1

log4j.rootLogger=debug,fileAppender
# ...
log4j.appender.fileAppender.File=${LOG_HOME}//log4j-log.log

Это почти скрытая функция...

log4j разные модули выводят в разные файлы

Различные модули: определите несколько экземпляров регистратора с именем пакета loggerName.

Различные файлы: определите несколько файловых приложений и свяжите их с экземпляром регистратора соответствующего loggerName.

Ссылаться на:woo woo woo.cn blog on.com/0201 host/afraid/5…

Вывод журнала динамически меняет путь

Ссылаться на:blog.CSDN.net/Я стираю ТТ, пока/…

Ссылаться на