我将实施一个企业范围的日志记录解决方案。这将是一个 Web 服务,它将获取所有异常并将有关该异常的详细信息写入某个数据库的某个位置。这样,我们可以将每个应用程序的所有日志信息记录到一个集中的位置,从而使监控我们的应用程序变得更简单一些。我也将使用日志监控前端应用程序(很可能是 Chainsaw,但我正在寻找一个 Web 前端,但我离题了)......
我在这里有几个菜鸟问题。通过阅读所有文档,当您尝试记录某些内容时,您会做这样的事情......
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Log4jJDBCExample
{
static Logger log = Logger.getLogger(Log4jJDBCExample.class);
public static void main(String[] args)
{
PropertyConfigurator.configure("log4j.properties");
log.debug("Sample debug message");
log.info("Sample info message");
log.error("Sample error message");
log.fatal("Sample fatal message");
}
}
我显然需要一个 log4j.properties 文件,否则这个东西就行不通了。所以我会这样做...
# Define the root logger with file appender
log4j.rootLogger = DEBUG, sql
# Define the file appender
log4j.appender.sql=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.sql.URL=jdbc:mysql://localhost/test
# Set Database Driver
log4j.appender.sql.driver=com.mysql.jdbc.Driver
# Set database user name and password
log4j.appender.sql.user=root
log4j.appender.sql.password=password
# Set the SQL statement to be executed.
log4j.appender.sql.sql=INSERT INTO LOGS VALUES ('%x', now() ,'%C','%p','%m')
# Define the xml layout for file appender
log4j.appender.sql.layout=org.apache.log4j.PatternLayout
顺便说一句,我基本上只是从该站点提取此代码... 在此处输入链接描述(如果有人想检查它,这是一个非常清晰的教程)。
这是伟大的。但这是实现将位于 Web 服务之后。我将让用户将类类型和错误(信息等)消息作为字符串作为 Web 有效负载的一部分发送,我还想记录用户名、堆栈跟踪(如果有)和应用程序 ID,这将也是我将尝试写入数据库的 Web 服务负载的一部分。
显然我需要在这里做一些扩展。在上面的示例中,作者创建了一个表
CREATE TABLE LOGS
(
USER_ID VARCHAR(20) NOT NULL,
DATED DATETIME NOT NULL,
LOGGER VARCHAR(50) NOT NULL,
LEVEL VARCHAR(10) NOT NULL,
MESSAGE VARCHAR(1000) NOT NULL
);
我会稍微改变一下那张桌子。我需要将 ClassName、ApplicationID 和 StackTrace 添加到该表中。所以这会更好地满足我的需求。
CREATE TABLE LOGS
(
USER_ID VARCHAR2(20) NOT NULL,
DATED DATETIME NOT NULL,
LOGGER VARCHAR2(50) NOT NULL,
LEVEL VARCHAR2(10) NOT NULL,
MESSAGE VARCHAR2(1000) NOT NULL,
CLASSNAME VARCHAR2(100) NOT NULL,
ApplicationID INT NOT NULL,
STACKTRACE VARCHAR2(4000 BYTE)
);
我将有另一个表,它将是一个应用程序表,它将存储应用程序名称和其他重要的应用程序详细信息。堆栈跟踪可以为空。
显然,我需要更改此语句,以便记录其余部分。
log4j.appender.sql.sql=INSERT INTO LOGS VALUES ('%x', now() ,'%C','%p','%m')
几个问题:
1)我对扩展 log4J 来做到这一点感到有些困惑。我显然需要扩展 JDBCAppender 并且可能是一个 appender。所以我捕获了所有这些信息。我一直在查看 Apache 的文档,但目前还不清楚要做什么以及通过配置文件进行配置还是扩展类是要走的路?
2)有点不清楚我是否可以将对象的名称传递给 getLogger Factory 函数并期望这个东西仍然可以工作。有人会调用我的服务并传入导致异常异常的类的名称。我不确定这会奏效。我假设使用 Logger 构建的类需要位于类路径或 Java 项目中,这样才不会引发一些奇怪的异常?那是正确的吗?如果是这样的话,我不确定 log4J 是否会成为这个项目的好工具。
3) 一种菜鸟 Java 项目问题。当我突然将 Log4J jar 导入我的项目时,我的项目将不再发布到我的本地服务器。我将 jar 作为外部 jar 添加到我的项目中,并且该项目是正在发布的 EAR 中的实用程序 Jar。该项目也是一个实用模块(将其添加为该项目的一个方面)。我可能在做一些愚蠢的事情。请随时严厉地让我知道它是什么。
4)你为此推荐一个好的前端吗?Chainsaw 看起来像一个 Windows 厚客户端,现在对我的目的来说很好,但我希望有一个更好的 Web 前端来支持这个项目。如果你有一个想法,请随时分享。