Как записать журнал ошибок или исключение в файл в Java - PullRequest
14 голосов
/ 20 февраля 2012

Есть ли способ записать журнал ошибок или исключение в файл в Java.Я прошел через Log4j.Я погуглил об этом, но не нашел хорошего решения.Я написал простой код

catch (Exception e) {
    PrintWriter pw = new PrintWriter(new FileOutputStream("Log"));     
    e.printStackTrace(pw);
} 

Есть ли другой способ записать ошибки или исключения?Может ли какой-либо орган предоставить мне образец примера Log4j?

Ответы [ 6 ]

26 голосов
/ 20 февраля 2012

Первое чтение log4j Руководство , легко настроить файл скользящего журнала.Вам не нужно выполнять какие-либо явные операции с файлами.

#SET LEVEL of ROOT-LOGGER, you will like to have Debug in local, but in prod you may just want WARN and ABOVE. This setting is done here!
log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number. (basically, format of log)
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

# THIS IS WHERE YOU WILL HAVE ALL THE LOG WRITTEN
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/var/log/applogs/example.log

# Maximum size of log file, usually we keep 10MB
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file, usually we keep 10
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Во-вторых, всякий раз, когда вы ловите исключение, делайте так:

public class MyClass{

  private static Logger logger = Logger.getLogger(MyClass.class);

  public ReturnType myMethod(Param p, Param2 p2) {
    ....
    ....
    try {
      ..    
    } catch(MyException e) {
       logger.log("Exceptions happen!", e); //this will put all the details in log file configured earlier
    }
    ....
  }

  ....
}

Стоит прочитать руководство.Еще лучше прочитать Полное руководство по log4j

4 голосов
/ 20 февраля 2012

Вы можете добавить исключение в качестве параметра в оператор log4j, например,

catch(Exception e)
{
    logger.error("Unexpected error", e);
}

Если у вас есть обработчик файлов, работающий в порядке, это выведет полную трассировку стека исключения.

4 голосов
/ 20 февраля 2012
try {
       System.setErr(new PrintStream(new FileOutputStream(System.getProperty("user.home")+"/error.log")));
} catch (FileNotFoundException ex) {
        ex.printStackTrace();
}

Теперь все сообщения об ошибках записываются в этот файл

3 голосов
/ 20 февраля 2012

Используя log4j, вы можете легко регистрировать исключения:

try {
    ...
} catch(Exception e) {
    log.error("An exception! Oops!", e);
}
1 голос
/ 20 февраля 2012

Посмотрите этот урок о "File Appender"

См. официальное краткое введение в Log4j и раздел "Конфигурация".

Вы также можетевыполните поиск по запросу "RollingFileAppender" или "File appender".

Вы настраиваете свой регистратор на отправку его сообщения аппендиру.Этот appender может пересылать сообщение в консоль (stdin), в файл (FileAppender, RollingFileAppender ...) ...

Используйте это для ведения журнала ошибок:

try{
    throw new Exception("bla bla bla...");
} catch( Exception e ){
     // log without stack trace
     mLogger.error("Your log message");

     // log with stack trace
     mLogger.error("Your log message", e);
}
0 голосов
/ 05 марта 2019

Вы можете регистрировать данные, используя зависимость log4j. Перейдите по этой ссылке

https://logging.apache.org/log4j/2.x/manual/configuration.html
Pom dependency ==>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>

Properties File eg ==>

status = error
dest = err
name = PropertiesConfig

property.filename = target/rolling/rollingtest.log

filter.threshold.type = ThresholdFilter
filter.threshold.level = debug

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = error

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}- 
%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5

logger.rolling.name = com.example.my.app //  Change this to your own package 
name otherwise will not work
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile

rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT

Java code ==>
private static final Logger logger = 
LogManager.getLogger(MyClass.class.getName());
logger.info("Entering application.");
logger.trace("Entering application.");
logger.debug("Debugg application.");
logger.error("Did it again!");
...