我们的项目一年来一直使用Jetty+HSQLDB作为开发环境,加上 JettyLuncher和DBEdit这两个插件,用起来还是非常地顺手。不过伴随着项目越来越大,内容越来越多,引进来的第三方包很多都使用了 commons-logging作为日志输出,比如hibernate, spring等等。项目大了之后log信息也变得非常多,再加上jetty本身的信息变得非常多了。本来想通过修改commons- logging.properties设置高级别的标准,但是发现并没有任何作用,这个问题困惑我了很久,今天终于不能忍了,打算从头到尾trace一下到底哪里有问题。
首先先来了解一下Commons-logging的工作流程,Commons-Logging有两个最重要的类: Log接口(负责日志输出)和LogFactory抽象类(负责创建具体的Log),很明显作为第一步得到LogFactory就需要知道其具体实现类,这个过程如下:
0, 准备工作,在classpath中读取commons-logging.properties;
1, 通过 System.getProperty()查找” org.apache.commons.logging.LogFactory”的值,作为LogFactory的具体实现类;如果没有继续
2, 通过 jar的Service Provider Discovery机制查找 "META-INF/services/org.apache.commons.logging.LogFactory"对应的资源,Service Provider Discovery是JDK1.3之后出现的,我们熟知的XML解析器的查找过程就是利用这个机制。如果没有继续:
3, 从第0步读出来的properties里面查找” org.apache.commons.logging.LogFactory”的值,作为实现类;如果没有继续
4, 使用 Commons-Logging自己实现的LogFactoryImpl类。
到此,就可以创建LogFactory了,接下来就是创建Log类,对于第三方提供的LogFactory实现要看具体的实现而不同,我们只说说LogFactoryImpl(即Commons-Logging自带的实现)是如何做的:
1, 查看 LogFactoryImpl中的attributes有没有org.apache.commons.logging.Log对应的值,这个 attributes是以commons-logging.properties为基础的;
2, 查找 System.getPorperty()中org.apache.commons.logging.Log对应的值;
3, 如果有 Log4J则使用Log4J;
4, 如果能够使用Jdk14Logger就是用Jdk14Logger;
5, 如果能够使用Jdk13LumberjackLogger则使用Jdk13LumberjackLogger,(Lumberjack是为JDK1.2,1.3实现logging能力的一个开源包, http://javalogging.sourceforge.net/);
6, 都没有就使用SimpleLog。
由此可以看出,平常所说的查找顺序多半是指LogFactoryImpl中创建Log的顺序,而不是LogFactory具体实现的查找顺序。
再转回到所遇到的问题上,打开jettyluncher的源代码,看看PluginRunner.java类,这个类是用来启动jetty server的,在启动的时候有关log的作了如下的动作:
1, 调用了 LogFactory的releaseAll方法,看来只想是用自己的LogFactory,先把其他的都搞掉;
2, 接下来将 System.properties中的org.apache.commons.logging.LogFactory改为Jetty的实现 org.mortbay.log.Factory,很明显这样一做,后来所有使用到commons-logging的程序都会使用jetty的实现(除非也强制改掉);
3, 接下来就是平常的getFatory(), getInstance()的动作,也都没有问题;
4, 看来问题应该是出在了jetty的Log实现org.mortbay.log. LogImpl身上了,打开一看果然如此,LogImpl根本没有关commons-logging.properties的设置,完全自己定义了log level等等信息。并且它的配置无法从文件中读取,只能从System.getProperty()中读取,没办法,只好在Jetty Laucher启动的参数中加入-DDEBUG_VERBOSE=-1,再启动之后Info信息就不再出来了。
到这里可以明白为什么hibernate, spring之类的log level无法改变的原因,JettyLauncher将其他的LogFactory实现都干掉,注册了Jetty的实现,从而使得hibernate, spring都只能使用jetty的实现进行log输出,Jetty本身的实现也非常的不自然,难于修改它的log level。
分享到:
相关推荐
<New id="logger" class="org.eclipse.jetty.util.log.Slf4jLog"> <Set name="LoggerName">org.eclipse.jetty <Set name="Level">INFO ``` **10.2 请求日志** 请求日志用于记录每个HTTP请求的信息,如请求...
dubbo.log4j.level=WARN 其中,${user.home}是一个变量,表示启动Dubbo-monitor程序的操作系统用户目录。在本例中,操作系统用户为wusc,系统用户目录为/home/wusc。因此,三个目录的绝对路径为: dubbo.jetty....
它可以与 Tomcat、Jetty 等Servlet容器配合使用,提供类似于 Apache HTTP Server 的访问日志格式。 `logback.xml` 是 Logback 的配置文件,通过它可以设置日志级别、日志输出目的地、过滤器等。以下是一些配置示例...
- **社区支持**:广泛应用于许多知名的Java项目,如Hibernate、Jetty、Spring OSGi等。 **适配器机制**: - 当使用SLF4J时,可以通过在类路径中放置相应的适配器JAR来指定具体使用哪种日志实现。例如,如果希望使用...
- `dubbo.log4j.level`: 日志级别,例如WARN。 其中,`${user.home}`是一个环境变量,代表当前用户的主目录。例如,如果Dubbo监控中心由用户`wusc`启动,则`${user.home}`将被解析为`/home/wusc`。 ##### 3.2 启动...
`confFile` 参数指定了 `Urlwriter` 配置文件的位置,而 `logLevel` 参数则控制日志输出的级别。 `Urlwriter` 提供了许多高级功能,如条件、拦截器、自定义函数等,可以实现复杂的需求。例如,你可以根据用户的角色...
它可以与Servlet容器如Tomcat、Jetty等无缝协作,记录HTTP请求信息。 **使用LogBack的关键知识点:** - **配置文件**:Logback 使用 XML 格式的配置文件(通常命名为 `logback.xml`),其中定义了日志级别(TRACE...
logLevel: 'debug' }); // 连接到服务器 cometd.handshake(); // 订阅频道 cometd.subscribe('/chat', function(message) { console.log('Received message:', message); }); // 发布消息 $('#send')....
3. **logback-access**:主要用于与Servlet容器(如Tomcat、Jetty等)集成,提供类似于 Apache HTTP Server 的访问日志记录功能。 **日志系统的重要性** 日志系统在软件开发中扮演着至关重要的角色。它可以帮助...
3. **logback-access**: 这个模块主要用于与Servlet容器集成,例如Tomcat、Jetty等,它可以与Servlet容器的访问日志功能配合,提供类似于Apache HTTP服务器的访问日志格式,便于分析和监控Web应用程序的访问情况。...
private String logLevel; ``` ### RESTful风格URL参数传递 - **@PathVariable**:这个注解用来接收URL路径中的变量。例如,在一个GET请求中,路径参数通过URL的一部分来传递。 - **示例**:一个获取用户详情的...
它可以与Servlet容器(如Tomcat、Jetty)配合,直接从HTTP请求生成日志。 **2. SLF4J接口** SLF4J(Simple Logging Facade for Java)是一个用于各种日志框架的简单抽象层,如Log4j、Logback等。它允许用户在部署时...
- 使用`logging.level.<package>=<level>`控制日志级别。 #### 2.3 数据源配置 - 自动配置支持多种数据库,如H2、MySQL、PostgreSQL等。 - 通过`spring.datasource.*`属性进行数据源配置。 ### 03 整合第三方技术 ...
path: /var/log/app.log ``` PageHelper是Mybatis的分页插件,它可以自动化处理分页查询,使得在编写SQL时无需关心分页逻辑。只需在Mybatis的Mapper接口方法上添加`@SelectProvider`和`@Options`注解,PageHelper...
<param-name>logLevel <param-value>WARN <param-name>confFile <param-value>/WEB-INF/urlrewrite.xml <filter-name>UrlRewriteFilter <url-pattern>/* <dispatcher>REQUEST <dispatcher>FORWARD ...
<param-name>logLevel <param-value>WARN <param-name>statusEnabled <param-value>true <filter-name>UrlRewriteFilter <url-pattern>/* <dispatcher>REQUEST <dispatcher>FORWARD ``` **3. 规则...
- **Logback/Log4j**:日志组件如Logback或Log4j用于记录系统运行日志,便于问题排查和性能分析。 综上所述,"springboot基于B2B平台的医疗病历交互系统"项目涵盖了Spring Boot开发、B2B业务交互、医疗数据标准、...
2. 内嵌Servlet容器:SpringBoot内置Tomcat或Jetty等Servlet容器,使得无需打包成WAR文件即可运行。 3. Starter POMs:SpringBoot通过一系列的Starter POMs帮助快速构建项目,简化Maven或Gradle配置。 二、...
2. **HLS支持**:High-Level Streaming Protocol (HLS)是苹果公司推出的一种适应不同网络条件的流媒体协议。Red5支持HLS,使得其内容能在iOS设备上播放。 3. **RTSP支持**:Real Time Streaming Protocol (RTSP)...
- 支持各种日志框架,如Logback、Log4j2等,通过logging.level属性配置日志级别。 - 自动配置日志输出格式和位置。 10. 缓存支持与配置详解 - 支持多种缓存技术,如Redis、Hazelcast、Infinispan等。 - 使用@...