Log4j : 가능한 가장 간단한 파일 로깅을 구성하는 방법은 무엇입니까?
내 이야기:
행을 파일에 기록하는 가장 간단한 log4j 로거만큼 간단한 것을 만들고 싶습니다. 몇 가지 기능이있는 몇 가지 예를 찾았지만 실제로 작동하는 기본적이고 일반적인 예는 아니며 각 행의 작동 방식에 대한 설명이없는 예를 찾았습니다.
질문:
아무도 하나를 제공 할 수 있습니까?
전제 조건 :
- 파일을 어디에 둘지 이미 알고 있으며 log4j를 구성하고 콘솔 로깅을 위해 작업하고 있습니다.
- 이제 파일에 기록하고 프로그램이 실행되면 파일 시스템에서 파일을 찾고 싶습니다.
- 기존
log4j.properties
파일에 추가해야하는 행 이 원하는 출력입니다.
일반적인 log4j.xml 파일이 하나 있습니다.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">
<appender name="default.console" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out" />
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<appender name="default.file" class="org.apache.log4j.FileAppender">
<param name="file" value="/log/mylogfile.log" />
<param name="append" value="false" />
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<appender name="another.file" class="org.apache.log4j.FileAppender">
<param name="file" value="/log/anotherlogfile.log" />
<param name="append" value="false" />
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<logger name="com.yourcompany.SomeClass" additivity="false">
<level value="debug" />
<appender-ref ref="another.file" />
</logger>
<root>
<priority value="info" />
<appender-ref ref="default.console" />
<appender-ref ref="default.file" />
</root>
</log4j:configuration>
하나의 콘솔, 두 개의 파일 어 펜더 및 하나의 로거가 첫 번째 파일 대신 두 번째 파일 어 펜더에 배치됩니다.
편집하다
이전 프로젝트 중 하나에서 간단한 log4j.properties 파일을 찾았습니다.
# For the general syntax of property based configuration files see
# the documentation of org.apache.log4j.PropertyConfigurator.
# The root category uses two appenders: default.out and default.file.
# The first one gathers all log output, the latter only starting with
# the priority INFO.
# The root priority is DEBUG, so that all classes can be logged unless
# defined otherwise in more specific properties.
log4j.rootLogger=DEBUG, default.out, default.file
# System.out.println appender for all classes
log4j.appender.default.out=org.apache.log4j.ConsoleAppender
log4j.appender.default.out.threshold=DEBUG
log4j.appender.default.out.layout=org.apache.log4j.PatternLayout
log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n
log4j.appender.default.file=org.apache.log4j.FileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=/log/mylogfile.log
log4j.appender.default.file.threshold=INFO
log4j.appender.default.file.layout=org.apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n
모든 레이아웃 인수에 대한 설명은 다음을 참조하십시오. log4j PatternLayout 인수
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="sample.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
</appender>
<root>
<priority value ="debug" />
<appender-ref ref="fileAppender" />
</root>
</log4j:configuration>
Log4j는 약간 혼란 스러울 수 있습니다. 그래서이 파일에서 무슨 일이 일어나고 있는지 이해해 보겠습니다. log4j에는 두 개의 기본 구성 인 appender와 logger가 있습니다.
Appender 는 항목이 추가되는 방법과 위치를 정의합니다. 파일, 콘솔, 데이터베이스 등에 기록됩니까? 이 경우 fileAppender로 전달되는 로그 문 sample.log
이 레이아웃 태그에 지정된 패턴을 사용하여 파일 에 배치 되도록 지정 합니다. 콘솔이나 데이터베이스에 대한 어 펜더를 쉽게 만들 수 있습니다. 콘솔 어 펜더는 화면의 레이아웃과 같은 것을 지정하고 데이터베이스 어 펜더는 연결 세부 정보와 테이블 이름을 갖게됩니다.
Loggers respond to logging events as they bubble up. If an event catches the interest of a specific logger it will invoke its attached appenders. In the example below you have only one logger the root logger - which responds to all logging events by default. In addition to the root logger you can specify more specific loggers that respond to events from specific packages. These loggers can have their own appenders specified using the appender-ref
tags or will otherwise inherit the appenders from the root logger. Using more specific loggers allows you to fine tune the logging level on specific packages or to direct certain packages to other appenders.
So what this file is saying is:
- Create a fileAppender that logs to file sample.log
- Attach that appender to the root logger.
- The root logger will respond to any events at least as detailed as 'debug' level
- The appender is configured to only log events that are at least as detailed as 'info'
The net out is that if you have a logger.debug("blah blah")
in your code it will get ignored. A logger.info("Blah blah");
will output to sample.log.
The snippet below could be added to the file above with the log4j tags. This logger would inherit the appenders from <root>
but would limit the all logging events from the package org.springframework
to those logged at level info
or above.
<!-- Example Package level Logger -->
<logger name="org.springframework">
<level value="info"/>
</logger>
Here's a simple one that I often use:
# Set up logging to include a file record of the output
# Note: the file is always created, even if there is
# no actual output.
log4j.rootLogger=error, stdout, R
# Log format to standard out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
# File based log output
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=owls_conditions.log
log4j.appender.R.MaxFileSize=10000KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
The format of the log is as follows:
ERROR [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44)
http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.
Such a format is defined by the string %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
. You can read the meaning of conversion characters in log4j javadoc for PatternLayout
.
Included comments should help in understanding what it does. Further notes:
- it logs both to console and to file; in this case the file is named
owls_conditions.log
: change it according to your needs; - files are rotated when they reach 10000KB, and one back-up file is kept
Here is a log4j.properties file that I've used with great success.
logDir=/var/log/myapp
log4j.rootLogger=INFO, stdout
#log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n
log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
log4j.appender.stdout.File=${logDir}/myapp.log
log4j.appender.stdout.append=true
The DailyRollingFileAppender will create new files each day with file names that look like this:
myapp.log.2017-01-27
myapp.log.2017-01-28
myapp.log.2017-01-29
myapp.log <-- today's log
Each entry in the log file will will have this format:
01/30/2017 12:59:47 AM|INFO |Component1 | calling foobar(): userId=123, returning totalSent=1
01/30/2017 12:59:47 AM|INFO |Component2 | count=1 > 0, calling fooBar()
Set the location of the above file by using -Dlog4j.configuration
, as mentioned in this posting:
java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp
In your Java code, be sure to set the name of each software component when you instantiate your logger object. I also like to log to both the log file and standard output, so I wrote this small function.
private static final Logger LOGGER = Logger.getLogger("Component1");
public static void log(org.apache.log4j.Logger logger, String message) {
logger.info(message);
System.out.printf("%s\n", message);
}
public static String stackTraceToString(Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
return sw.toString();
}
And then call it like so:
LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));
참고URL : https://stackoverflow.com/questions/6358836/log4j-how-to-configure-simplest-possible-file-logging
'Program Tip' 카테고리의 다른 글
Makefile : 문자열 포함 (0) | 2020.11.27 |
---|---|
Python의 unittest를 가져 오면 tearDown () 메서드가 생성됩니다. (0) | 2020.11.27 |
NSUserDefaults에 값을 저장하는 데 제한이 있습니까? (0) | 2020.11.27 |
같음 연산에서 "SQL_Latin1_General_CP1_CI_AS"와 "Latin1_General_CI_AI"간의 데이터 정렬 충돌을 해결할 수 없습니다. (0) | 2020.11.27 |
git 콘솔에서 : 배치 파일을 실행 한 다음 git 콘솔로 돌아가려면 어떻게해야합니까? (0) | 2020.11.27 |