我们在进行Android开发时,经常会有这种粗薯体会,由于客户的设备型号各不相同,从而导致出现多种问题,但对于研发人员,因为没有log日志文件,不太容易定位问题的具体位置。所以我们急需一个能将程序日志写到SD卡文件里的工具,类似web的log4j那样。这时microlog4android进入我们的视野,虽然它尚有不足,但也已能满足大部分需求。
使用microlog4android的步骤如下:
1、下载
到http://code.google.com/p/microlog4android/downloads/list 下载microlog4android-1.0.0.jar和microlog.properties文件。
2、建立使用logger对象
private static final Logger logger = LoggerFactory.getLogger(main.class)
3、在程序的第一个activity的oncreate方法里初始化方法
PropertyConfigurator.getConfigurator(this).configure()
4、把microlog.properties文件放到assets文件夹里
注意:assets文件夹是与res文件夹平级的。
然后更改microlog.properties文件为以下内容:
microlog.level=DEBUG microlog.appender=LogCatAppenderFileAppender microlog.formatter=PatternFormatter microlog.formatter.PatternFormatter.pattern=%c [%P] %m %T
5、写日志记录
logger.debug("这是debug信息")
6、在AndroidManifest.xml 添加写sd卡的权限
运行程序,然后到SD卡根目录,可以发现有一个microlog.txt的'文件,里面就是我们的日志了。
更改日志问价的路径和名称
有朋友问如何更改日志文件的路径和名称,在网上找了一通的资料,没找到答案,只好到https://github.com/johanlkarlsson/microlog4android 下载源代码,经过查看源代码的PropertyConfigurator类,发现源代码里有这么蔽凳清一个配置参数microlog.appender.FileAppender.File,这样应该就可以更改日志文件的路径和名称了。
配置文件如下:
microlog.level=DEBUG microlog.appender=FileAppenderLogCatAppender microlog.appender.FileAppender.File=mylog.txt microlog.formatter=PatternFormatter microlog.formatter.PatternFormatter.pattern=%c [%P] %m %T
运行程序,发现日志文件还是叫microlog.txt,更改名称无效,找了各种原因都无法解决,只好反编译我们之前下载的microlog4android-1.0.0.jar包,发现PropertyConfigurator这个类和刚刚从GIT下载的源代码PropertyConfigurator类不一样,microlog4android-1.0.0.jar包里的PropertyConfigurator类没有这样的一个宏前参数microlog.appender.FileAppender.File,只好把从GIT下载下来的源代码,重新打个包,暂时打成microlog4android-1.1.jar,然后重新运行程序,OK,搞定,日志文件名称变成了我们配置的mylog.txt。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
在写入日志条目时,系统使用您标识的源来查找适当的日志以放入您的条目。EventLog组件实例一次只能向一个日志中写入项。说明:默认情况下,如果事先未将组件注册为有效的源就尝试写入日志项,系统会自动将该源注册到事件日志中,并将
Source
属性的值用作源字符串。通常在安装应用程序的过程氏州运中创建新的事件源。这样, *** 作系统就有时间刷新自己的已注册事件源的列表及其配置。如果 *** 作系统未刷新其事件源列表,而您试图用新的事件源来编写事件,则写 *** 作将失败。如果不能选择在安装过程中创建事件源,则请尝试在第一次写 *** 作之前尽早创建事件源,比如在应用程序初始迹弯化过程中创建。如果选择这种方法,请确保使用计算机上的管理员权限运行初始化代码。这些权限是创建新事件源所必需的权限。如果在使用
CreateEventSource
方法时指定了并不存在的日志名,系统将在您第一次尝试向日志中写入项时使用该名称创建一个新的、自定义的事件日志。有关更多信息,请参见
如何:创建和移除自定义事件日志。可以使用事件类别和消息字符串的本地化资源来注册事件源。应用程序可以使用资源标识符而不是通过指定实际字符串值来写入事件日志项。以下代码提供了一个示例:C#VB
System.Diagnostics.EventSourceCreationData
creationData
=
new
System.Diagnostics.EventSourceCreationData("ApplicationName",
"Application")
creationData.MachineName
=
"ServerName"
EventLog.CreateEventSource(creationData)
请参见任务如何:确定事件源是否存在如何:移除事件源如何:创建和移除自定义事件日志演练:浏览事件日志、事件源和项概念EventLog
组件介绍参歼梁考EventLog
使用C++语言编写写日志类,支持写日志级别设置、支持多线程、支持可变形参表写日志态哗。
主要提供以下接口:
1、设置写日志的级别 2、写关键日志信息 3、写错误日志信息 4、写警告日志掘清信息 5、写一般日志信息
#ifndef COMMAND_DEFINE_H#define COMMAND_DEFINE_H//日志级别的提示信息static const char * KEYINFOPREFIX = " Key: n"static const char * ERRORPREFIX = "帆散行 Error: n"static const char * WARNINGPREFIX = " Warning: n"static const char * INFOPREFIX = " Info: n"static const int MAX_STR_LEN = 1024//日志级别枚举typedef enum EnumLogLevel{ LogLevelAll = 0, //所有信息都写日志 LogLevelMid, //写错误、警告信息 LogLevelNormal, //只写错误信息 LogLevelStop //不写日志}#endif
#ifndef LOGGER_H_#define LOGGER_H_#include#include#include "CommandDefine.h"/* * 类名:Logger * 作用:提供写日志功能,支持多线程,支持可变形参数 *** 作,支持写日志级别的设置 * 接口:SetLogLevel:设置写日志级别 TraceKeyInfo:忽略日志级别,写关键信息 TraceError:写错误信息 TraceWarning:写警告信息 TraceInfo:写一般信息*/class Logger{public: //默认构造函数 Logger()//构造函数 Logger(const char * strLogPath, EnumLogLevel nLogLevel = EnumLogLevel::LogLevelNormal)//析构函数 virtual ~Logger()public: //写关键信息 void TraceKeyInfo(const char * strInfo, ...)//写错误信息 void TraceError(const char* strInfo, ...)//写警告信息 void TraceWarning(const char * strInfo, ...)//写一般信息 void TraceInfo(const char * strInfo, ...)//设置写日志级别 void SetLogLevel(EnumLogLevel nLevel)private: //写文件 *** 作 void Trace(const char * strInfo)//获取当前系统时间 char * GetCurrentTime()//创建日志文件名称 void GenerateLogName()//创建日志路径 void CreateLogPath()private: //写日志文件流 FILE * m_pFileStream//写日志级别 EnumLogLevel m_nLogLevel//日志的路径 char m_strLogPath[MAX_STR_LEN]//日志的名称 char m_strCurLogName[MAX_STR_LEN]//线程同步的临界区变量 CRITICAL_SECTION m_cs}#endif
#include "Logger.h"#include#include#include#include#pragma comment(lib, "DbgHelp.lib") //默认构造函数Logger::Logger(){ //初始化 memset(m_strLogPath, 0, MAX_STR_LEN)memset(m_strCurLogName, 0, MAX_STR_LEN)m_pFileStream = NULL//设置默认的写日志级别 m_nLogLevel = EnumLogLevel::LogLevelNormal//初始化临界区变量 InitializeCriticalSection(&m_cs)//创建日志文件名 GenerateLogName()} //构造函数Logger::Logger(const char * strLogPath, EnumLogLevel nLogLevel):m_nLogLevel(nLogLevel){ //初始化 m_pFileStream = NULLstrcpy(m_strLogPath, strLogPath)InitializeCriticalSection(&m_cs)CreateLogPath()GenerateLogName()} //析构函数Logger::~Logger(){ //释放临界区 DeleteCriticalSection(&m_cs)//关闭文件流 if(m_pFileStream) fclose(m_pFileStream)} //写关键信息接口void Logger::TraceKeyInfo(const char * strInfo, ...){ if(!strInfo) returnchar pTemp[MAX_STR_LEN] = {0}strcpy(pTemp, GetCurrentTime())strcat(pTemp, KEYINFOPREFIX)//获取可变形参 va_list arg_ptr = NULLva_start(arg_ptr, strInfo)vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr)va_end(arg_ptr)//写日志文件 Trace(pTemp)arg_ptr = NULL} //写错误信息void Logger::TraceError(const char* strInfo, ...){ //判断当前的写日志级别,若设置为不写日志则函数返回 if(m_nLogLevel >= EnumLogLevel::LogLevelStop) returnif(!strInfo) returnchar pTemp[MAX_STR_LEN] = {0}strcpy(pTemp, GetCurrentTime())strcat(pTemp, ERRORPREFIX)va_list arg_ptr = NULLva_start(arg_ptr, strInfo)vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr)va_end(arg_ptr)Trace(pTemp)arg_ptr = NULL} //写警告信息void Logger::TraceWarning(const char * strInfo, ...){ //判断当前的'写日志级别,若设置为只写错误信息则函数返回 if(m_nLogLevel >= EnumLogLevel::LogLevelNormal) returnif(!strInfo) returnchar pTemp[MAX_STR_LEN] = {0}strcpy(pTemp, GetCurrentTime())strcat(pTemp, WARNINGPREFIX)va_list arg_ptr = NULLva_start(arg_ptr, strInfo)vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr)va_end(arg_ptr)Trace(pTemp)arg_ptr = NULL} //写一般信息void Logger::TraceInfo(const char * strInfo, ...){ //判断当前的写日志级别,若设置只写错误和警告信息则函数返回 if(m_nLogLevel >= EnumLogLevel::LogLevelMid) returnif(!strInfo) returnchar pTemp[MAX_STR_LEN] = {0}strcpy(pTemp, GetCurrentTime())strcat(pTemp,INFOPREFIX)va_list arg_ptr = NULLva_start(arg_ptr, strInfo)vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr)va_end(arg_ptr)Trace(pTemp)arg_ptr = NULL} //获取系统当前时间char * Logger::GetCurrentTime(){ time_t curTimestruct tm * pTimeInfo = NULLtime(&curTime)pTimeInfo = localtime(&curTime)char temp[MAX_STR_LEN] = {0}sprintf(temp, "%02d:%02d:%02d", pTimeInfo->tm_hour, pTimeInfo->tm_min, pTimeInfo->tm_sec)char * pTemp = tempreturn pTemp} //设置写日志级别void Logger::SetLogLevel(EnumLogLevel nLevel){ m_nLogLevel = nLevel} //写文件 *** 作void Logger::Trace(const char * strInfo){ if(!strInfo) returntry { //进入临界区 EnterCriticalSection(&m_cs)//若文件流没有打开,则重新打开 if(!m_pFileStream) { char temp[1024] = {0}strcat(temp, m_strLogPath)strcat(temp, m_strCurLogName)m_pFileStream = fopen(temp, "a+")if(!m_pFileStream) { return} } //写日志信息到文件流 fprintf(m_pFileStream, "%sn", strInfo)fflush(m_pFileStream)//离开临界区 LeaveCriticalSection(&m_cs)} //若发生异常,则先离开临界区,防止死锁 catch(...) { LeaveCriticalSection(&m_cs)}} //创建日志文件的名称void Logger::GenerateLogName(){ time_t curTimestruct tm * pTimeInfo = NULLtime(&curTime)pTimeInfo = localtime(&curTime)char temp[1024] = {0}//日志的名称如:2013-01-01.log sprintf(temp, "%04d-%02d-%02d.log", pTimeInfo->tm_year+1900, pTimeInfo->tm_mon + 1, pTimeInfo->tm_mday)if(0 != strcmp(m_strCurLogName, temp)) { strcpy(m_strCurLogName,temp)if(m_pFileStream) fclose(m_pFileStream)char temp[1024] = {0}strcat(temp, m_strLogPath)strcat(temp, m_strCurLogName)//以追加的方式打开文件流 m_pFileStream = fopen(temp, "a+")} } //创建日志文件的路径void Logger::CreateLogPath(){ if(0 != strlen(m_strLogPath)) { strcat(m_strLogPath, "")} MakeSureDirectoryPathExists(m_strLogPath)}
以上就是本文的全部内容,希望对大家的学习C++有所帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)