opencms Log研究

引入:

这篇文章主要快速的研究下opencms所采用的日志系统以及各自的log文件。

分析:

(1)安装opencms时的log

因为在opencms安装时候会自动调用$CATALINA_HOME/opencms/WEB-INF目录下的setup.bat(如果是UNIX机器则是setup.sh)

而这个执行脚本中,会配置真实执行的命令是

...
rem Set standard command for invoking Java.
set _RUNJAVA="%JAVA_HOME%\bin\java.exe"
set MAINCLASS=org.opencms.setup.CmsAutoSetup
...
rem execute OPENCMS
%_RUNJAVA% %JAVA_OPTS% -classpath "%OPENCMS_HOME%\classes%CLASSPATH%%OPENCMS_CP%%TOMCAT_LIB%" %MAINCLASS% %CMD_LINE_ARGS%

所以,它其实会去执行CmsAutoSetup类,而这个执行向导(wizard)实际是通过CmsAutoSetupBean来完成的:

    public CmsAutoSetup(CmsAutoSetupProperties props) {

        m_props = props;
        m_bean = new CmsSetupBean();
        m_bean.init(props.getSetupWebappPath(), props.getServeltMapping(), props.getSetupDefaultWebappName());
    }

而CmsAutoSetupBean中定义了安装向导中的日志文件位置:

    /** Location for log file.  */
    protected String m_logFile = CmsSystemInfo.FOLDER_WEBINF + CmsLog.FOLDER_LOGS + "setup.log";

    /** Location for logs relative to the webapp folder.  */
    protected String m_logsFolder = CmsSystemInfo.FOLDER_WEBINF + CmsLog.FOLDER_LOGS;

可以看出这个m_logFile的位置是在 $CATALINA_HOME/webapps/opencms/WEB-INF/logs目录下的setup.log.

(2)运行时的Log

因为org.opencms.main.OpenCms类提供了Opencms系统的运行时,它的getLog()方法会调用CmsLog类的静态方法getLog()方法。我们查看了CmsLog类,可以发现它的静态初始块中有如下代码:

 /**
     * Initializes the OpenCms logger configuration.<p>
     */
    static {
        try {
            // look for the log4j.properties that shipped with OpenCms
            URL url = Loader.getResource("log4j.properties");
            if (url != null) {
                // found some log4j properties, let‘s see if these are the ones used by OpenCms
                String path = CmsFileUtil.normalizePath(url, ‘/‘);
                // in a default OpenCms configuration, the following path would point to the OpenCms "WEB-INF" folder
                String webInfPath = CmsResource.getParentFolder(CmsResource.getFolderPath(path));
                // check for the OpenCms configuration file
                // check for the OpenCms tld file
                String tldFilePath = webInfPath + CmsSystemInfo.FILE_TLD;
                File tldFile = new File(tldFilePath);
                if (tldFile.exists()) {
                    // assume this is a default OpenCms log configuration                
                    CmsParameterConfiguration configuration = new CmsParameterConfiguration(path);
                    // check if OpenCms should set the log file environment variable
                    boolean setLogFile = configuration.getBoolean("opencms.set.logfile", false);
                    if (setLogFile) {
                        // set "opencms.log" variable 
                        String logFilePath = CmsFileUtil.normalizePath(webInfPath + FOLDER_LOGS + FILE_LOG, ‘/‘);
                        File logFile = new File(logFilePath);
                        m_logFileRfsPath = logFile.getAbsolutePath();
                        m_logFileRfsFolder = CmsFileUtil.normalizePath(logFile.getParent() + ‘/‘, File.separatorChar);
                        System.setProperty("opencms.logfile", m_logFileRfsPath);
                        System.setProperty("opencms.logfolder", m_logFileRfsFolder);
                        // re-read the configuration with the new environment variable available
                        PropertyConfigurator.configure(path);
                    }
                }
                // can‘t localize this message since this would end in an endless logger init loop
                INIT.info(". Log4j config file    : " + path);
            }
       ...
    }

这就说明,它会在配置文件log4j.properties中检查key为opencms.set.logfile对应的value,如果是true,则会把运行时的log文件设置在WEB-INF/logs目录下的opencms.log文件。

而log4j.properties中已经把这个开关设为true 了:

# OpenCms provides a special variable ${opencms.logfile} to the environment, which contains
# the log file path. The location of this file is calculated relative to this 
# "log4j.properties" file on OpenCms startup. If this file is located in the folder "${classes}",
# then the log is written to "${classes}../logs/opencms.log". 
# To disable this mechanism, you must set ${opencms.set.logfile} to "false". In this case 
# you must configure the log output file manually.
opencms.set.logfile=true

所以我们明白,运行时的日志,都存在了$CATALINA_HOME/webapps/opencms/WEB-INF/logs目录下的opencms.log.

时间: 2024-10-26 16:12:16

opencms Log研究的相关文章

Windows下从源代码编译Skia

在PPAPI里面画图,能够结合第三方的图形库.比方Cairo.Skia. Google Chrome.Chromium和Android都使用Skia作为画图引擎.我也来试试Skia,先过编译关. foruok原创.如需转载请关注foruok的微信订阅号"程序视界"联系foruok. CEF编译出的Skia不可单独用 Chromium使用Skia.Windows下从源代码编译CEF说明了怎么编译CEF,它会捎带着编译Chromium.里面有Skia,但它编译出来的skia_library

英语词根词缀记忆大全

第一部分 通过词缀认识单词 (常用前缀一) 1.a- ① 加在单词或词根前面,表示"不,无,非" acentric 无中心的(a+centric中心的) asocial 不好社交的(a+social好社交的) amoral 非道德性的(a+moral道德的:注意:immoral不道德的) apolitical. 不关政治的(a+political政治的) anemia 反常的(a+nomal正常的+ous) ② 加在单词前,表示"在…,…的" asleep 睡着的(

理解mpvue的生命周期

mpvue是美团基于vue开发的一个开发小程序的框架,从而以vue的语法来开发小程序.在生命周期上,mpvue同时支持了vue的生命周期和小程序的生命周期,这可能让新上手的同学费解.这篇文章就来讲讲mpvue的混合生命周期. 一个bug 在深入之前,先说一个mpvue开发中的常见的坑.假设你在一个页面中有打开了一个弹窗,然后在没有关闭的情况下返回上一页,然后再重新进入时,弹窗依然在那里.按道理说,返回上一页时,弹窗所在的page实例已经被unload了,为什么再次进入弹窗还在呢,这其实是mpvu

opencms 发布过程深入研究

引入: 比起创建Resource,发布过程要困难很多,我上周在support team时候曾经设想不通过调试器,光走读代码来明白其中的奥秘,后来因为堆栈太深而放弃了,现在有了调试器,终于把这些细节弄明白了,果然非常复杂. 细节分析: 在发布Resource时,它的入口是CmsPublishProject类的actionPublish()方法,发布过程复杂到变态,全包装在performDialogOperation()方法中: /**      * @seeorg.opencms.workplac

iptables学习与研究(使用LOG记录失败日志)

原文地址: http://blog.csdn.net/fafa211/article/details/2307581 通常情况下,iptables的默认政策为DROP,不匹配的数据包将被直接丢弃.但在丢弃之前建议把信息记录下来,以使你了解哪些信息没有通过规则,有时可依此判断是否有人在尝试攻击你的服务器. 下面给出一个用来详细记录未匹配规则的数据包的iptables规则: #记录下未符合规则的udp数据包,然后丢弃之. #iptables -A INPUT -i $IFACE -p udp -j

opencms 页面编辑模式研究

引入: opencms中引入了直接编辑页面的能力,因为我本身对页面编辑特性不是很感兴趣,所以这里就从技术角度分享一些常见的分析opencms中页面的方法. 实践:找到指定文件的对应代码 比如,我们要分析在VFS中的"Offline"模式下的/site/default/demo/text-block 模块下的index.html. 首先,我们在workplace中选中此文件,然后右键选择Properties, 然后切换到第二个tab,可以查看它用的模板的路径: 此路径为:/system/

Unity3d插件研究之Easytouch

但我们开发移动端的游戏时,发现使用Input.GetMouseButtonDown的方法不可用,怎么办? 虽然unity3d也有自带触屏的方法,但是使用起来代价太高,什么单击,双击这些功能都要自己封装. 下面我们来讲下EasyTouch这个插件,它将所有触屏的手势,都已经写好了. 而且Easytouch也支持NGUI,使用起来十分的方便. 接下来,我们详细地学习这个插件改如何运用到我们的项目中来. 首先,我们导入easytouch插件,这里我是用3.0版本的,可能有些老了,我都没更新,但是大致的

JAVA深入研究——Method的Invoke方法。

在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错.虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码. Method的invoke方法 1.先检查 AccessibleObject的override属性是否为true. Accessibl

规范打log

在公司工作快3年了,debug用的最多的还是分析程序打出来的log. 怎样打log,打什么样的log,也是很值得研究的事情.好的打log方式,能够很快的分析和解决问题. 下面总结两点: 1.在log中显示函数和行的信息 2.给log分等级,哪些log默认打. 给出下面sample 只输出error信息: