Как записать журнал ошибок или исключение в файл на java

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

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

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


person adesh    schedule 20.02.2012    source источник


Ответы (6)


Сначала прочтите руководство по 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

person Nishant    schedule 20.02.2012
comment
и что мне делать, если появляются неотмеченные исключения? Как я могу быть уверен, что ВСЕ будет отправлено на регистратор? - person phil294; 17.02.2015
comment
Используйте Throwable, чтобы поймать все. Но это не рекомендуется. Возможно, вы захотите прочитать эти сообщения: 1. stackoverflow.com/questions/6115896/ 2. stackoverflow.com/questions/2274102/ - person Nishant; 18.02.2015
comment
@Nishant Где будет находиться файл журнала ?? Это внутри папки apache? - person KJEjava48; 03.04.2017

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

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

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

person Brian    schedule 20.02.2012

try {
       System.setErr(new PrintStream(new FileOutputStream(System.getProperty("user.home")+"/error.log")));
} catch (FileNotFoundException ex) {
        ex.printStackTrace();
}

Теперь весь вывод ошибок записывается в этот файл.

person Thargor    schedule 20.02.2012
comment
Хотя технически правильно, чем это лучше, чем использование фреймворка журналирования (log4j, juli, commons-logging и т. Д.)? - person pap; 20.02.2012
comment
Зачем использовать фреймворк, если вы можете решить это с помощью собственных методов javas? - person Thargor; 20.02.2012
comment
1: Нет поддержки различных уровней журналов 2: Нет поддержки диагностических контекстов (поток, класс, метод и т. Д.) 3: Нет поддержки форматирования вывода Я мог бы продолжить. Вы можете забить гвоздь отверткой, но почему бы вам не использовать молоток, если он у вас есть? - person pap; 20.02.2012
comment
Да, но если вы ТОЛЬКО хотите записывать все ошибки в файл, вы можете использовать эту простую строку кода. Если вы хотите иметь все эти функции, выберите фреймворк. Если вы хотите выкопать небольшую яму, вы берете лопату, если хотите выкопать большую яму, вы берете электрическую лопату. - person Thargor; 20.02.2012
comment
Вы называете их функциями, а я называю их минимальными требованиями к ведению журнала приложений. Думаю, разные амбиции. - person pap; 20.02.2012
comment
Для меня это нормально, просто хочу, чтобы там была простая однострочная вещь для очень простого приложения. - person DoubleDouble; 20.12.2016

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

try {
    ...
} catch(Exception e) {
    log.error("An exception! Oops!", e);
}
person Community    schedule 20.02.2012

Посмотрите это руководство о «Приложении файлов»

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

Вы также можете выполнить поиск по «RollingFileAppender» или «File 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);
}
person Sly    schedule 20.02.2012

Вы можете регистрировать данные, используя зависимость 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!");
person Vishnu M    schedule 05.03.2019