java log4j trace_java – 转换e.printStackTrace()以改为使用log4j

我对log4j很新.我不想在我的日志文件中显示异常堆栈跟踪,例如

java.lang.IllegalArgumentException: nodeRef is a mandatory parameter

at org.alfresco.util.ParameterCheck.mandatory(ParameterCheck.java:42)

这些异常通过使用e.printStackTrace()直接写入控制台

try {

// something

} catch(Exception e) {

StringWriter stack = new StringWriter();

e.printStackTrace(new PrintWriter(stack));

logger.debug("Caught exception; decorating with appropriate status template : " + stack.toString());

}

我现在正在定制一个开源项目,而不是自己编写我的所有程序.

所以不可能删除e.printStackTrace();在所有的java文件中.

据我所知,log4j用logger打印的日志可以通过使用log4j错误级别来配置,例如info,debug,warn.But如何直接写入控制台或文件?

如何配置log4j不打印只有异常堆栈跟踪但显示其他信息?有办法解决吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个简单的Java代码示例,可以解析log4j格式的日志文件: ```java import java.io.BufferedReader; import java.io.FileReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Log4jParser { public static void main(String[] args) { String logFile = "path/to/your/log/file.log"; try (BufferedReader reader = new BufferedReader(new FileReader(logFile))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split("\\s", 4); // 拆分日志行 if (parts.length >= 4) { String timestamp = parts[0] + " " + parts[1]; // 时间戳 String level = parts[2]; // 日志级别 String message = parts[3]; // 日志消息 Date date = parseTimestamp(timestamp); // 解析时间戳 System.out.printf("%s [%s] %s\n", date, level, message); // 打印解析结果 } } } catch (Exception e) { e.printStackTrace(); } } private static Date parseTimestamp(String timestamp) throws ParseException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); return format.parse(timestamp); } } ``` 在此示例中,我们使用BufferedReader类逐行读取日志文件,并使用String.split()方法拆分每一行,从而获取时间戳、日志级别和日志消息。我们将时间戳转换为Date对象,以便进行进一步的处理和格式化输出。 请注意,这只是一个简单的示例代码,实际的实现可能需要更复杂的逻辑来处理各种情况,例如多行消息或不同的日志级别格式。 ### 回答2: 要解析log4j格式的日志,可以使用Java中的正则表达式和字符串操作来提取日志中的各个字段。 首先,读取log文件并将每行日志存储在字符串数组中。可以使用Java中的文件读取和字符串操作方法来实现这一步骤。 接下来,对每一行日志应用正则表达式来提取需要的字段。log4j的日志格式通常包含时间戳、日志级别和具体日志消息。可以使用正则表达式来匹配这些字段并将其存储在对应的变量中。 例如,可以使用如下的正则表达式来匹配log4j日志的时间戳: String regexTimestamp = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"; 使用Java中的Pattern和Matcher类来进行匹配: Pattern patternTimestamp = Pattern.compile(regexTimestamp); Matcher matcherTimestamp = patternTimestamp.matcher(logLine); 然后,使用matcherTimestamp.find()方法来查找匹配的时间戳,并通过matcherTimestamp.group()方法来获取匹配的结果。 类似地,可以使用类似的步骤来提取日志级别和具体日志消息的字段。 最后,将提取的字段进行处理和存储,可以将它们打印出来或存储到其他地方,根据具体需求进行相应的操作。 以上就是使用Java解析log4j格式日志的一个简单示例。具体实现中可能还需要考虑异常处理、文件读取和写入等其他细节。 ### 回答3: 在Java中解析log4j格式的日志文件,我们可以使用log4j库提供的API方法来实现。以下是一个简单的代码示例: ```java import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.ThrowableInformation; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Log4jParser { public static void main(String[] args) { String logFilePath = "path/to/logfile.log"; parseLog4jLog(logFilePath); } public static void parseLog4jLog(String filePath) { try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; Logger logger = Logger.getLogger(Log4jParser.class); PatternLayout layout = new PatternLayout(); while ((line = reader.readLine()) != null) { LoggingEvent logEvent = layout.parse(line); String logMessage = logEvent.getMessage().toString(); String logLevel = logEvent.getLevel().toString(); String logTimestamp = logEvent.getTimeStamp() + ""; ThrowableInformation throwableInfo = logEvent.getThrowableInformation(); if (throwableInfo != null) { String exceptionStacktrace = throwableInfo.getThrowableStrRep()[0]; // 对于包含异常信息的log,可以通过 throwableInfo 获取异常栈信息 } // 处理解析的日志信息,可根据需要进行相应的业务逻辑处理 System.out.println("Timestamp: " + logTimestamp); System.out.println("Level: " + logLevel); System.out.println("Message: " + logMessage); } } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码中,我们使用`BufferedReader`从日志文件中逐行读取日志内容。然后,我们通过`PatternLayout`的`parse`方法将每行日志内容解析为`LoggingEvent`对象。通过`LoggingEvent`对象,我们可以获取日志的时间戳、日志级别、日志消息以及可选的异常栈信息。 在代码示例中,我们简单示范了如何处理解析的日志信息,你可以根据实际需求进行业务逻辑处理或其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值