log4cplus写日志失败 能把日志输出到不同的日志文件吗

君,已阅读到文档的结尾了呢~~
log4cplus是C
编写的开源的日志系统,功能非常全面 本文介绍如何在Windows VS2008中使用该日志库。
可从网站 url http
log4cplus sourceforge net
url 上去下载 log4cplus 1 0 3 rc9 具体地址 url http
downloads sourceforge net log4cplus log4cplus 1 0 3 rc9 tar bz2 use mirror nchc
url ,同时附件也带有这个库。
三 配置环境
nbsp..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
log4cplus vs使用技巧 转
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口下载地址: &:http://sourceforge.net/projects/log4cplus/
非常棒的中文文档:
(可直接去人家的分类里有列表:)
如果上面的链接是正常的,下面的内容别不看了浪费时间。
1.简 介&&& log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统.受Apache Software License保护。作者是Tad E. Smith。&&& log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期;你可以选择将信息输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。&2.下 载最新的log4cplus可以从以下网址下载。:http://sourceforge.net/projects/log4cplus/3.安 装#tar xvzf log4cplus-1.0.4-rc10.tar.gz#cd log4cplus-1.0.4-rc10#./configure --prefix=/usr/local#make#make install安装成功会在/usr/local/lib下看到 liblog4cplus.a,在/usr/local/include下有个liblog4cplus文件夹
4.配 置确保你的Makefile中包含 /usr/local/lib/liblog4cplus.a(静态库)或-llog4cplus(动态库)即可。头文件在/usr /local/include/log4cplus目录下。对于动态库,要想正常使用,还得将库安装路径加入到 LD_LIBRARY_PATH 中,以管理员身份登录,在/etc/ld.so.conf中加入安装路径,这里是/usr/local/lib,然后执行 ldconfig使设置生效即可。
5.运行测试程序直接运行源码包中tests目录下的测试程序
6.log4cplus内容介绍1.log4cplus基本元素
&&& Layouts&&&&&& :控制输出消息的格式。&&& Appenders& :输出位置。&&& Logger&&&&&&& :日志对象。&&& Priorities&&&&& :优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。
2.log4cplus基本结构
3. 使用步骤:
&&& a.) 生成Appender对象。
&&& b.) 生成Layout对象,并绑定到Appender。(可选)
&&& c.) 生成Logger对象。
&&& d.) 设置Logger优先级。(可选)
&&& e.) 将需要关联Logger的Appender添加到Logger上。
&&& f.) 使用Logger输出信息,所有大于设定的优先级的信息,并在所有挂接在该Logger对象上的Appender上以相应的Layout设定的格式显示出来。
&4. Logger对象
Logger对象具有层次结构,按名称区分,如下代码:&&&
Logger test = Logger::getInstance("test");&Logger subtest = Logger::getInstance("test.subtest");
&&& 对象subtest是test的子对象。
&&& log4cplus优先级有低到高:
&&& NOT_SET_LOG_LEVEL :接受缺省的LogLevel,如果有父logger则继承它的LogLevel&&& ALL_LOG_LEVEL :开放所有log信息输出&&& TRACE_LOG_LEVEL :开放trace信息输出(即ALL_LOG_LEVEL)&&& DEBUG_LOG_LEVEL :开放debug信息输出&&& INFO_LOG_LEVEL& :开放info信息输出&&& WARN_LOG_LEVEL& :开放warning信息输出&&& ERROR_LOG_LEVEL :开放error信息输出&&& FATAL_LOG_LEVEL :开放fatal信息输出&&& OFF_LOG_LEVEL :关闭所有log信息输出
&&& 各个logger可以通过setLogLevel设置自己的优先级,当某个logger的LogLevel设置成NOT_SET_LOG_LEVEL时,该logger会继承父logger的优先级,另外,如果定义了重名的多个logger, 对其中任何一个的修改都会同时改变其它logger。
6.Layout格式输出
1.) SimpleLayout&&& 是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-"。
2.) TTCCLayout&&& 其格式由时间,线程ID,Logger和NDC 组成。
3.) PatternLayout
&&& 是一种有词法分析功能的模式布局器,类似正则表达式。以&%&作为开头的特殊预定义标识符,将产生特殊的格式信息。
(1)"%%",转义为% 。
(2)"%c",输出logger名称,如test.subtest&。也可以控制logger名称的显示层次,比如"%c{1}"时输出"test",其中数字表示层次。(3)"%D",显示本地时间,比如:" 18:55:45",%d显示标准时间。&&&& 可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的&&&& 预定义标识符如下:&&&&&&&&%a -- 表示礼拜几,英文缩写形式,比如"Fri"&&&%A -- 表示礼拜几,比如"Friday"&&&%b -- 表示几月份,英文缩写形式,比如"Oct"&&&%B -- 表示几月份,"October"&&&%c -- 标准的日期+时间格式,如 "Sat Oct 16 18:56:19 2004"&&&%d -- 表示今天是这个月的几号(1-31)"16"&&&%H -- 表示当前时刻是几时(0-23),如 "18"&&&%I -- 表示当前时刻是几时(1-12),如 "6"&&&%j -- 表示今天是哪一天(1-366),如 "290"&&&%m -- 表示本月是哪一月(1-12),如 "10"&&&%M -- 表示当前时刻是哪一分钟(0-59),如 "59"&&&%p -- 表示现在是上午还是下午, AM or PM&&&%q -- 表示当前时刻中毫秒部分(0-999),如 "237"&&&%Q -- 表示当前时刻中带小数的毫秒部分(0-999.999),如 "430.732"&&&%S -- 表示当前时刻的多少秒(0-59),如 "32"&&&%U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 "41"&&&%w -- 表示礼拜几,(0-6, 礼拜天为0),如 "6"&&&%W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53),如 "41"&&&%x -- 标准的日期格式,如 "10/16/04"&&&%&&&X -- 标准的时间格式,如 "19:02:34"&&&%y -- 两位数的年份(0-99),如 "04"&&&%Y -- 四位数的年份,如 "2004"&&&%Z -- 时区名,比如 "GMT"
(4)"%F",输出当前记录器所在的文件名称,比如"main.cpp"(5)"%L",输出当前记录器所在的文件行号,比如"51"(6)"%l",输出当前记录器所在的文件名称和行号,比如"main.cpp:51"(7)"%m",输出原始信息。(8)"%n", 换行符。
(9)"%p",输出LogLevel,比如"DEBUG"(10)"%t",输出记录器所在的线程ID,比如 ""(11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分。(12)格式对齐,比如"%-10m"时表示左对齐,宽度是10,当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等。
7.) Appender输出位置
(1)控制台输出
&&&&&&& ConsoleAppender
(2)文件输出
&&&&&&& FileAppender / RollingFileAppender / DailyRollingFileAppender .
FileAppender :
&&& 实现了基本的文件操作功能,构造函数如下:
&&& FileAppender(filename,mode,immediateFlush);
&filename&& 文件名&mode& 文件类型,可选择的文件类型包括app,ate,binary,in,out,trunc。缺省是trunc,表示将先前文件删除。&immediateFlush& 缓冲刷新标志.
RollingFileAppender:
RollingFileAppender(filename,maxFileSize,maxBackupIndex,immediateFlush)filename&&&&&& : 文件名maxFileSize&&& : 文件的最大尺寸maxBackupIndex : 最大记录文件数immediateFlush : 缓冲刷新标志
可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,除了定义每个记录文件的大小之外,你还要确定在 RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),当存储的文件数目超过 maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1 。
DailyRollingFileAppender:
DailyRollingFileAppender(filename,&schedule,immediateFlush,& maxBackupIndex)filename&&&&&& : 文件名schedule&&&&&& : 存储频度immediateFlush : 缓冲刷新标志maxBackupIndex : 最大记录文件数
DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中,这里的频度包
转载来源:http://myswirl./blog/static //
log4cplus是一款优秀的基于C/C++的开源日志库。log4cplus具有线程安全,不用但心在多线程状态下写日志问题;使用灵活,可通过配置文件设置日志级别下输出位置,还可以在程序运行时动态设置日志输出级别,随心所欲掌控日志的输出;以及多粒度控制的特点。通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期; 可以选择将信息输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份。可以满足大部分开发者对日志系统需求,功能全面。下载地址:tar -xjf log4cplus-1.0.4.tar.bz2(解压缩),切换到解压缩路径下安装:./make install这里已经安装成功,默认的路径lib库路径是/usr/local/lib/,头文件的位置:/usr/local/include/log4cplus将/usr/local/lib下的和log4cplus相关的库都拷贝到/usr/lib,将头文件加到/etc/profile下的CPLUS_INCLUDE_PATH这里要强调是使用log4cplus时,要&加上-llog4cplus -lrt -lpthread -lrt(或者 -llog4cplus -lpthread ),才能顺利的编译通过和使用;
阅读(...) 评论()log4j中配置日志文件相对路径
log4j中配置日志文件相对路径
这篇文章写得比较全面,转过来,算是共享吧,同时感谢javaeye上的zengjinliang,呵呵&方法一、 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log&其中“${WORKDIR}/”是个变量,会被System Property中的“WORKDIR”的值代替。这样,我们就可以在log4j加载配置文件之前,先用System.setProperty ("WORKDIR", WORKDIR);设置好根路径,此操作可通过一初始的servlet进行。&方法二、可以使用服务器环境变量&log4j的配置文件支持服务器的vm的环境变量,格式类似${catalina.home}&log4j.appender.R=org.apache.log4j.RollingFileAppender&log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log&log4j.appender.R.MaxFileSize=10KB&其中的${catalina.home}并非windows系统的环境变量,这个环境变量就不需要在Windows系统的环境变量中设置。之所以这样,你可以看看tomcat\bin\catalina.bat(startup,shutdown都是调用这个)里面自带有-Dcatalina.home= "%CATALINA_HOME%" 。继承这个思想,所以你也可以自己设定一个参数-Dmylog.home="D:/abc/log"到对应的服务器java启动的vm参数中&方法三、通过servlet初始化init()方法中加载file属性实现相对路径&具体实现:做一个servlet,在系统加载的时候,就把properties的文件读到一个properties文件中.那个file的属性值(我使用的是相对目录)改掉(前面加上系统的根目录),让后把这个properties对象设置到propertyConfig中去,这样就初始化了log的设置.在后面的使用中就用不着再配置了&一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件&(1).在项目启动时,装入初始化类:&public class Log4jInit extends HttpServlet {&&&&&&&&& static Logger logger = Logger.getLogger(Log4jInit.class);&&&&&&&&& public Log4jInit() {&&&&&&&&& }&&&&&&&&& public void init(ServletConfig config) throws ServletException {&&&&&&&&&&&&& String prefix = config.getServletContext().getRealPath("/");&&&&&&&&&&&&& String file = config.getInitParameter("log4j");&&&&&&&&&&&&& String filePath = prefix +&&&&&&&&&&&&& Properties props = new Properties();&&&&&&&&&&&&& try {&&&&&&&&&&&&&&&&& FileInputStream istream = new FileInputStream(filePath);&&&&&&&&&&&&&&&&& props.load(istream);&&&&&&&&&&&&&&&&& istream.close();&&&&&&&&&&&&&&&&& //toPrint(props.getProperty("log4j.appender.file.File"));&&&&&&&&&&&&&&&&& String logFile = prefix + props.getProperty("log4j.appender.file.File");//设置路径&&&&&&&&&&&&&&&&& props.setProperty("log4j.appender.file.File",logFile);&&&&&&&&&&&&&&&&& PropertyConfigurator.configure(props);//装入log4j配置信息&&&&&&&&&&&&& } catch (IOException e) {&&&&&&&&&&&&&&&&& toPrint("Could not read configuration file [" + filePath + "].");&&&&&&&&&&&&&&&&& toPrint("Ignoring configuration file [" + filePath + "].");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&& }&&&&&&&&& public static void toPrint(String content) {&&&&&&&&&&&&& System.out.println(content);&&&&&&&&& }&}&实际上log4j的配置文件log4j.properties如为默认名,可放置在JVM能读到的classpath里的任意地方,一般是放在WEB- INF/classes目录下。当log4j的配置文件不再是默认名,则需要另外加载并给出参数,如上 “ropertyConfigurator.configure(props);//装入log4j配置信息”&(2).Web.xml中的配置&&servlet&&&&&&&&&& &servlet-name&log4j-init&/servlet-name&&&&&&&&&& &servlet-class&Log4jInit&/servlet-class&&&&&&&&&& &init-param&&&&&&&&&&&& &param-name&log4j&/param-name&&&&&&&&&&&& &param-value&WEB-INF/classes/log4j.properties&/param-value&&&&&&&&&& &/init-param&&&&&&&&&& &load-on-startup&1&/load-on-startup&&&&&&&& &/servlet&&注意:上面的load-on-startup设为0,以便在Web容器启动时即装入该Servlet。log4j.properties文件放在根的properties子目录中,也可以把它放在其它目录中。应该把.properties文件集中存放,这样方便管理。&(3).log4j.properties中即可配置log4j.appender.file.File为当前应用的相对路径.&以上是网上log4j日志文件的相对路径配置的三种方法(我能找到的就三种),分析:&方法一主要是扩展了log4j的RollingFileAppender类,其他的FileAppender同样道理。扩展的方法,就是用一个子类去覆盖setFile方法,这个方法在log4j读取配置文件生成appender的时候调用,传入的就是配&置文件中的路径,这样我就可以按照自己的想法在路径前面加上根路径了。这种方法可以在log4j.properties中用相对路径自由配置log4j.appender.A1.File属性来决定生成的日志相对web应用根&目录的位置。&方法二是利用服务器vm中已经存在的环境变量如${catalina.home}来设置相对于${catalina.home}的日志路径,日志只能放到服务器子目录里,而且如果是用的其它服务器,则要改对应的环境变量。此方法平台移植不方便。&方法三是扩展ActionServlet类,覆盖其init()方法,新方法中载入log4j.properties位置的参数,可以自由配置log4j的配置文件的名字和存放位置。也可自由配置log4j日志文件的相对于当前应用的路径。详&细代码如下:&程序代码&package wbb.bysxxglxt.&import org.apache.struts.action.*;&import mons.logging.LogF&import mons.logging.L&import javax.servlet.ServletE&import java.util.P&import java.io.InputS&import org.apache.log4j.PropertyC&import java.io.FileInputS&import java.io.IOE&public class ExtendedActionServlet extends ActionServlet {&&&&&&&& private Log log = LogFactory.getLog(this.getClass().getName());&&&&&&&& public ExtendedActionServlet() {}&&&&&&&& public void init() throws ServletException {&&&&&&&&&&&& (&&&&&&&&&&&&&&&&&&&& "Initializing, My MyActionServlet init this System's Const Variable");&&&&&&&&&&& String prefix = this.getServletConfig().getServletContext().getRealPath(&&&&&&&&&&&&&&&&&&&& "/");&&&&&&&&&&&& String file = this.getServletConfig().getInitParameter("log4j");&&&&&&&&&&&& String filePath = prefix +&&&&&&&&&&&& Properties props = new Properties();&&&&&&&&&&&& System.out.println(prefix);&&&&&&&&&&&& System.out.println(file);&&&&&&&&&&&& System.out.println(filePath);&&&&&&&&&&&& try {&&&&&&&&&&&&&&&& FileInputStream log4jStream = new FileInputStream(filePath);&&&&&&&&&&&&&&&& props.load(log4jStream);&&&&&&&&&&&&&&&& log4jStream.close();&&&&&&&&&&&&&&&& String logFile = prefix +&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& props.getProperty("log4j.appender.A1.File"); //设置路径&&&&&&&&&&&&&&&& System.out.println(logFile);&&&&&&&&&&&&&&&& props.setProperty("log4j.appender.A1.File", logFile);&&&&&&&&&&&&&&&& PropertyConfigurator.configure(props); //装入log4j配置信息&&&&&&&&&&&& } catch (IOException e) {&&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&&& }&&&&&&&&&&&& ("Initializing, end My Init");&&&&&&&&&&&& super.init();//应用了struts,此方法不能省,ActionServlet覆盖了的此方法中有很多重要操作&&&&&&&& }&}&**********************应用web.xml 关键部分***************************&&&&&&&程序代码&&servlet&&&&&&&&& &servlet-name&action&/servlet-name&&&&&&&&& &servlet-class&wbb.bysxxglxt.util.ExtendedActionServlet&/servlet-class&&&&&&&&& &init-param&&&&&&&&&&& &param-name&config&/param-name&&&&&&&&&&& &param-value&/WEB-INF/struts-config.xml&/param-value&&&&&&&&& &/init-param&&&&&&&&& &init-param&&&&&&&&&&&&& &param-name&log4j&/param-name&&&&&&&&&&&&& &param-value&properties\log4j.properties&/param-value&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &/init-param&&&&&&&&& &init-param&&&&&&&&&&& &param-name&debug&/param-name&&&&&&&&&&& &param-value&0&/param-value&&&&&&&&& &/init-param&&&&&&&&& &init-param&&&&&&&&&&& &param-name&application&/param-name&&&&&&&&&&& &param-value&ApplicationResources&/param-value&&&&&&&&& &/init-param&&&&&&&&& &load-on-startup&0&/load-on-startup&&&&&&& &/servlet&&&&&&& &servlet-mapping&&&&&&&&& &servlet-name&action&/servlet-name&&&&&&&&& &url-pattern&*.do&/url-pattern&&&&&&& &/servlet-mapping&&注意log4j参数中相对路径的斜杠线的写法,而且log4j属性文件如放置在web-inf/classes目录或web-inf等目录中最好改名,因为在加载此Servlet之前,服务器如tomcat启动时会自动搜索web-inf目录和web-inf/classes目录中log4j.properties文件,如有则自动加载。log4j属性文件加载后,由于该属性文件中log4j.appender.A1.File的值用的是相对路径,自动加载配置便会出错:&log4j:ERROR setFile(null,true) call failed.&java.io.FileNotFoundException: WEB-INF\logs\bysxxglxt.log (系统找不到指定的路径。)&不知道log4j为什么会这么早自动启动。尽管后面加载扩展的ActionServlet中正确设置了log4j属性文件并正常加载了,但报的这个错还是怪不爽的,于是只有更改log4j属性文件名字或者更改其存放位置,让其不能自动加载了,不过还是有两个警告:&log4j:WARN No appenders could be found for logger (mons.digester.Digester.sax).&log4j:WARN Please initialize the log4j system properly.&这样做就算是掩耳盗铃了,如果你有更好的解决办法,希望能在此贴出来,大家一起研究。&********************log4j.properties*****************************&### 设置logger级别 ###&程序代码&log4j.rootLogger=DEBUG,stdout,A1&### appender.stdout输出到控制台 ###&log4j.appender.stdout=org.apache.log4j.ConsoleAppender&log4j.appender.stdout.Target=System.out&log4j.appender.stdout.layout=org.apache.log4j.PatternLayout&log4j.appender.stdout.layout.ConversionPattern= [%5p] [BYSXXGLXT] %d{yyyy-MM-dd HH:mm:ss}: %-4r [%-5p] [%t] ( %F,%L ) - %m%n&### appender.A1输出到日志文件 ###&log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender&log4j.appender.A1.File=WEB-INF\\logs\\bysxxglxt.log&##注意上面日志文件相对应用根目录路径的写法&log4j.appender.A1.DatePattern='.'yyyy-MM-dd'.log'&log4j.appender.A1.Append=true&## 输出DEBUG级别以上的日志&log4j.appender.A1.Threshold=DEBUG&log4j.appender.A1.layout=org.apache.log4j.PatternLayout&log4j.appender.A1.layout.ConversionPattern= [%5p] [BYSXXGLXT] %d{yyyy-MM-dd HH:mm:ss}: %-4r&&&& [%t] ( %F,%L ) - %m%n
发表评论:
TA的最新馆藏[转]&log4cplus 能把日志输出到不同的日志文件吗_百度知道

我要回帖

更多关于 log4cplus写日志失败 的文章

 

随机推荐