- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我花了一些时间找出一种可持续的方法来过滤 ERROR
我的应用程序实时记录 JBoss
服务器。与Log4j
我可以轻松使用SocketAppender
我按照它通知 ERROR
的方式配置了它实时登录。不幸的是我不能用 JBoss AS 7
来做到这一点。我找不到 SocketAppender
除了 SMTPAppender
之外的其他实现方式。所以我想出了一个办法来解决这个问题。请看看我到目前为止做了什么。
我为 Logger
编写了一种包装器.
我的应用程序的示例类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
private Logger logger= LoggerFactory.getLogger(MyClass.class);
public void updateData(String data){
logger.info("updating data with {} ",data);
try {
// do somthing
}catch (Exception e){
//something went wrong
logger.error("update fail ",e);// I want to get this message real time
}
}
}
现在我想到了一个方法来获取 ERROR
日志。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyLogger {
private Logger logger = null;
private MyLogger() {
}
public static MyLogger getLogger(Class clazz) {
MyLogger logger = new MyLogger();
logger.logger = LoggerFactory.getLogger(clazz);
return logger;
}
public void info(String format, Object... arguments) {
logger.info(format,arguments);
}
public void error(String format, Object... arguments) {
// now i can send this message real time,
// i am calling web service with error log by a new Thread
logger.error(format,arguments); // say line number 10
}
}
MyLogger
使用方法如下
public class MyClass {
private static MyLogger logger= MyLogger.getLogger(MyClass.class);
public void updateData(String data){
logger.info("updating data with {} ",data);
try {
// do somthing
}catch (Exception e){
//something went wrong
logger.error("update fail ",e); // say line number 14
}
}
}
此时我的要求符合,但这会产生一个新问题。
以下是JBoss
的记录器格式配置
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p (%F:%L) (%t) %s%E%n"/>
现在%F
-文件名将变为MyLogger
类(class)。和%L
- 行号将成为MyLogger
的行号这会导致日志不准确。
部分示例日志
(MyLogger.java : 10) // but this should be (MyClass.java : 14)
现在我已将此模式更改为
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c:%L] (%t) %s%E%n"/>
这几乎可以工作,但是 %c
-class name 给出了预期的正确类。但无法获取行号(正确的行号)。
更改记录器 paten 后我得到了什么
(com.my.test.MyClass : 10) // but this should be (com.my.test.MyClass : 14)
这是我的问题。
SocketAppender
或 JMSAppender
)与 JBoss AS7
一起使用?(在 Jboss AS 7 上没有找到有效的解决方案)我已经在 JBossDeveloper
中提出了问题。但至少目前还没有任何评论。
https://developer.jboss.org/thread/249729
任何帮助都非常感谢。
最佳答案
如果您使用的是 JBoss 7.2 (EAP 6.1) 或更高版本,则可以使用 Log4j 附加程序 作为自定义处理程序 ( check this issue )。
例如。
<custom-handler name="server" class="org.apache.log4j.net.SocketAppender" module="org.apache.log4j">
<level name="INFO"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
</formatter>
<properties>
<property name="RemoteHost" value="10.10.10.10"/>
<property name="Port" value="1234"/>
<property name="LocationInfo" value="true"/>
<property name="ReconnectionDelay" value="10000"/>
</properties>
</custom-handler>
在其他情况下,使其在 JBoss AS 7 中工作的唯一方法是为 SocketAppender
开发自定义 java.util.logging.Handler
。
查看Creating a custom logging handler in JBOSS as 7.1.0 Final和 Custom log handlers on 7.0.1创建自定义日志处理程序,然后将它们委托(delegate)给 Log4jAppenderHandler
。
例如(示例代码):
import java.util.Collections;
import java.util.logging.Filter;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.net.SocketAppender;
import org.apache.log4j.net.SyslogAppender;
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import org.jboss.logmanager.ExtLogRecord;
import org.jboss.logmanager.log4j.handlers.Log4jAppenderHandler;
public class SocketHandler extends Handler {
private final Log4jAppenderHandler log4j = new Log4jAppenderHandler(new SocketAppender());
@Override
public void publish(LogRecord record) {
if (record == null) {
return;
}
ExtLogRecord extRecord;
if (record instanceof ExtLogRecord) {
extRecord = (ExtLogRecord) record;
} else {
extRecord = ExtLogRecord.wrap(record);
}
if (isLoggable(record)) {
LoggingEvent event = new LoggingEvent(extRecord.getLoggerClassName(),
Logger.getLogger(extRecord.getLoggerClassName()), extRecord.getMillis(),
Level.toLevel(extRecord.getLevel().toString()), extRecord.getFormattedMessage(),
extRecord.getThreadName(), extRecord.getThrown() == null ? null
: new ThrowableInformation(extRecord.getThrown()), extRecord.getNdc(),
new LocationInfo(new Throwable(), extRecord.getLoggerClassName()),
Collections.singletonMap("org.jboss.logmanager.record", extRecord));
((SyslogAppender) log4j.getAppender()).doAppend(event);
flush();
}
}
@Override
public void flush() {
log4j.flush();
}
@Override
public void close() throws SecurityException {
log4j.close();
}
@Override
public void setFilter(Filter filter) {
log4j.setFilter(filter);
}
@Override
public void setFormatter(Formatter formatter) {
log4j.setFormatter(formatter);
}
public void setThreshold(String threshold) {
((SocketAppender) log4j.getAppender()).setThreshold(Level.toLevel(threshold));
}
public void setRemoteHost(String remoteHost) {
((SocketAppender) log4j.getAppender()).setRemoteHost(remoteHost);
}
public void setPort(String port) {
try {
((SocketAppender) log4j.getAppender()).setPort(Integer.parseInt(port));
} catch (Exception e) {}
}
public void setReconnectionDelay(String reconnectionDelay) {
try {
((SocketAppender) log4j.getAppender()).setReconnectionDelay(Integer.parseInt(reconnectionDelay));
} catch (Exception e) {}
}
public void setLocationInfo(String locationInfo) {
try {
((SocketAppender) log4j.getAppender()).setLocationInfo(Boolean.parseBoolean(locationInfo));
} catch (Exception e) {}
}
}
我认为最好的方法是这样,这样您就不会在应用程序中实现日志记录。
我希望这会有所帮助。
关于java - 如何在以下上下文中获得正确的记录器行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27039249/
有没有办法配置 python 记录器来调用自定义函数并在它记录时将记录消息传递给它? 谢谢! 最佳答案 子类 logging.Handler 并实现 emit方法: import logging cl
我有一个这样的记录器设置: import logging from logging.handlers import RotatingFileHandler import sys # root logg
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我一直在使用 Netbeans 作为 Java IDE 进行开发。当 Netbeans 在 try-catch block 中包含一条语句时,它在捕获区域中使用类似 Logger.getLogger(
我正在记下远程日志记录的功能从头开始构建时可能需要库。我查了这个:http://www.aggsoft.com/serial-data-logger.htm 我想知道a之间有什么区别远程日志记录库和远
我需要跟踪包含数千个 JAR 和 .CLASS 文件的已编译 Java 应用程序,您知道有什么合适的工具可以附加到 JVM 来跟踪函数调用(无需源代码)吗? 最佳答案 是的。 Jprofiler无需源
我想使用记录器并设置其属性,但不想在每个对象类中创建记录器,我的目标是:在Spring中创建一个bean,创建属性文件我如何使用注释,可以做到吗? 最佳答案 是的,你可以做到, 在你的
首先,我已经阅读了real python article on the subject . 了解到记录器具有层次结构后,我想在这样的层次结构中创建一个名为 MyProjectLogger 的新记录器:
我设置了一个记录器。像这样: def initLogger(self): self.logger = logging.getLogger('MyApp') if not self.lo
是否允许为您的日志创建一个静态类? public final class Log { public static final Logger LOGGER = Logger.getLogger(
我对 java.util.logging 有一些无法解释的行为。让我们看一下这两个示例: 首先: boolean var = false; log.log( Level.WARNING, "Cant
我正在尝试开始在 python 中使用日志记录并阅读了几篇博客。一个让我感到困惑的问题是是按功能还是按模块创建记录器。在这个Blog: Good logging practice in Python建
我正在使用 https://pub.dartlang.org/packages/logging ,但它不会在我的日志中显示任何内容。这是我的代码: class Test { final Logge
public static Logger getLogger() { final Throwable t = new Throwable(); final StackTraceElem
我是 Poco 的新手,我在 Poco 在线帮助中看到了以下示例: int main(int argc, char** argv) { AutoPtr pChannel(new SimpleF
我有一个带有函数、文档字符串和文档测试的 Julia 模块文件。我加载它并在 Julia 帮助中显示文档字符串,但 Documenter.jl 找不到文档字符串。 一个示例模块文件,src/my_mo
我正在尝试在我的 Django 项目( django 1.11 、 Python 3.6 )中实现日志记录。我正在使用默认的 django 记录器。 获取 username在日志中,我使用了 djan
是否可以有多个 serilog 记录器?目前,在我的 WebApi 中,我可以调用 Log.Information 来记录信息事件,但是有没有一种方法可以改为制作不同的日志并从我的 Controlle
我有一个 python 应用程序,其文件结构类似于以下内容: /Project file1.py file2.py file3.py ... 该应用程序使用 Pytho
如何访问 python Bokeh 记录器? 我尝试使用 basicConfig包装器,但它似乎不起作用。 from bokeh.util import logconfig logconfig.bas
我是一名优秀的程序员,十分优秀!