本文目录一览:
程序发布后记录日志失败
程序发布后记录日志失败的解决方案。
1、文件权限:在发布到服务器上的时候,可能文件没有写入权限,导致日志无法正常写入打开IIS,找到发布的文件-点击右键-编辑权限,出现该文件的属性,点击安全-编辑-找到IIS_IUSRS写入权限。
2、没有log4net的文件配置:在配置的时候,有些人的配置文件不一样,有的是在web.config中配置,有的是新建文件log4net.config中配置,在发布的时候,发布包中没有log4net.config文件,只有手动将该文件复制到发布包中。-文件程序记录日志
3、属性更改:选择解决方案中的log4net.config,在属性-复制到输出目录,选择始终复制。
4、配置文件:配置文件中的错误,需要检查每一个点,查看写入的路径有没有错误,或者是格式不对,需要仔细的检查每一个设置点,比较麻烦,在配置的时候要仔细。
C++日志记录类以及日志记录程序
使用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 = NULL; strcpy(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) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp, KEYINFOPREFIX); //获取可变形参 va_list arg_ptr = NULL; va_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) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp, ERRORPREFIX); va_list arg_ptr = NULL; va_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) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp, WARNINGPREFIX); va_list arg_ptr = NULL; va_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) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp,INFOPREFIX); va_list arg_ptr = NULL; va_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 curTime; struct tm * pTimeInfo = NULL; time(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 = temp; return pTemp; } //设置写日志级别void Logger::SetLogLevel(EnumLogLevel nLevel){ m_nLogLevel = nLevel;} //写文件操作void Logger::Trace(const char * strInfo){ if(!strInfo) return; try { //进入临界区 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 curTime; struct tm * pTimeInfo = NULL; time(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++有所帮助。
记录程序日志的三种选择
1、采用Log4CXX等公共开源日志组件:这类日志组件的特点是跨平台且功能比较强大,例如可以把日志发往另一台服务器或记录到数据库中等;另外,可配置性较高,可以通过配置文件或程序代码对日志进行很多个性化设置。但从另外一个角度看,由于这些优点往往也导致了在使用方面的缺点。首先,对于一般应用程序来说,它们并不需要太多的功能,通常只需要把日志记录到文件或反馈到应用程序,功能太多反正让用户使用起来觉得繁琐还得背负很多从来都用不到的代码。其次,这类日志组件通常是跨平台的,并不只是针对 Windows 或 VC 的`应用程序,因此使用起来总会觉得有点别扭,例如他们的字符都是用 char 类型的,对于一个 Unicode 程序来说每次写日志都要做字符转换是很不爽的事情,本座在多年前曾经使用过 Log4Cpp ,程序执行时总是报告日志组件有内存泄露,虽然有可能是误报,但是使用起来总觉得很不舒服。-文件程序记录日志
2、自己写几个简单的类或函数记录日志:这种方法的确很简单,通常都不用一两百行的代码。但这种方法通常缺乏规范性和通用性,其他程序需要记录类似的但有点差异的日志时,通常的作法是:Copy-Paste-Modify;另外,这类方法很可能也没有考虑性能或并发方面的问题,通常是直接在工作线程中写日志,对于那些性能要求较高的应用程序是绝对不允许的。-文件程序记录日志
3、干脆不记录任何日志:的确,现在很多程序由于各种原因并没有记录任何日志。但本座以为,如果一个程序是有用的,具备一定功能,并且需要连续运行较长一段时间,那么记录日志是必须的;否则,得认真考虑该程序是否有存在的必要了。-文件程序记录日志
程序文件必须有记录吗
是的。
要求必须的程序文件有七个。七个程序文件分别是:文件控制、记录控制、培训、内部审核、不合格品控制、纠正措施、预防措施。
程序记录日志,是历史形成的习惯。网络设备、系统及服务程序等,在运作时都会产生一个叫log的事件记录;每一行日志都记载着日期、时间、使用者及动作等相关操作的描述。