MFC标准类中没有CLog,不过如果你有其它人或第三方的类代码,一般可以直接使用。
所谓日志文件,就是一个逐行的文本文件,用MFC下任何一种文件管理模式都可以实现,比如CFile、CStudioFile、OpenFile、fopen等。
您可以创建日志文件,并使其包含与互 *** 作性、程序加载和网络有关的诊断信息。通过设置注册表项,可以启用日志记录。首先,设置一个注册表项以启用常规日志记录,然后针对所需的日志记录组件和选项来设置注册表项。
可以使用下列方法设置注册表项:
使用 Visual Studio 中的远程注册表编辑器。
在 NET Compact Framework 20 Service Pack 1 中,使用远程性能监视器中的日志记录选项。有关远程性能监视器的更多信息,请参见 如何:在运行时监视性能。
在 NET Compact Framework 35 中,可以使用日志记录工具 NetCFLoggingexe,该工具提供了用于启用和禁用日志记录的简单的图形用户界面。此工具包括在 Power Toys for NET Compact Framework 中。有关更多信息,请参见 Power Toys for NET Compact Framework。
使用 Registry 和 RegistryKey 类,NET Compact Framework 20 版及更高版本支持这些类。
下表对这些日志文件进行了总结。
日志记录组件
日志文件内容
互 *** 作
记录 COM 互 *** 作调用。提供有关平台调用和封送处理的信息。
错误
记录所有未处理的异常和本机异常。将错误记录到日志文件和 OutputDebugString 中。将为位于当前路径的每个程序集创建日志文件,并将其应用于当前会话。在第一次出现未处理的异常或本机异常之后,将覆盖日志文件。
加载程序
记录有关程序加载的信息。文件标头包含下列信息:
应用程序名称。
进程 ID(由 Windows Embedded CE 提供)。
创建日志文件的本地日期和时间。其格式不是全局性的,而是区域性特定的。
NET Compact Framework 版本,例如 20502100。
与平台相关的信息,例如 Windows Embedded CE v501400 (CEPC) WinCE5x86 debug Dev i386 IJITv2。
文件提供以下信息:
强制状态(兼容性模式)。
加载模块时为模块指定的信任级别。
解析方法时失败。
解析类型时失败。
查找或加载程序集或模块时失败。
程序集加载成功。
无效的元数据版本。
查找平台调用 DLL 时失败。
在平台调用 DLL 中查找函数时失败。
策略文件的名称,或者指出缺少该文件的事实。
策略文件处理过程中的主要错误。
托管程序集基于策略的重定向。
此外,还可以包括有关全局程序集缓存的信息。
网络
记录网络流量。网络日志文件是二进制文件,如果没有 NET Compact Framework 日志查看器 Logviewerexe,则无法访问该文件。在 NET Compact Framework 35 及更高版本中,该日志查看器包含在 Power Toys for NET Compact Framework 中。有关更多信息,请参见 Power Toys for NET Compact Framework。
由于网络日志记录发生在 Windows 套接字层,因此日志文件只包含网络数据包信息。这包括通过网络发送的数据,其中有些可能是敏感数据,因而需要进行加密。
终结器
记录在垃圾回收器丢弃对象之前未释放这些对象的类名。NET Compact Framework 35 及更高版本支持此日志。
对象名不包含在日志中,原因是这些名称对于公共语言运行时 (CLR) 不可用。但是,未释放的对象的类名有助于识别这些对象。未释放的对象在应用程序中可能造成性能问题。
说明:
某些情况下,调用终结器的是 NET Compact Framework 而不是应用程序代码。
此文件包含以下信息:
指示终结器何时对对象运行垃圾回收器的时间戳。
被终结对象的类。
跟踪
记录 Windows Communication Foundation (WCF) 的代码异常。桌面 NET Framework 支持三种日志记录:跟踪、消息处理和事件日志记录。NET Compact Framework 上的 WCF 只支持通过跟踪日志记录来跟踪代码异常,但它不记录警告和错误消息。
NET Compact Framework 35 及更高版本支持此日志。
默认情况下,系统会将日志文件写入包含被诊断的应用程序的目录。但是,您可以使用注册表项指定路径和其他选项,如下所示:
使用其他路径写入日志文件。这需要安全注册表的访问权限。
在日志文件名中包含应用程序名称。
在日志文件名中包含进程 ID。
日志文件名由以下几部分组成,其中组件 可以是“互 *** 作”、“错误”、“加载程序”或“网络”、“终结器”或“跟踪”:
netcf_应用程序名称_组件_进程 IDlog
应用程序名称和进程 ID 为可选项,它们基于注册表设置。
例如,对于名为 MyAppexe 的应用程序,其加载程序日志文件可命名如下:
netcf_MyApp_Loader_2066923010log
有关如何检查互 *** 作日志文件和加载程序日志文件等日志文件的信息,请参见 日志文件信息。
启用日志记录
将以下 Enabled 项的值设置为 1:
HKLM\Software\Microsoft\NETCompactFramework\Diagnostics\Logging\Enabled
必须设置此项值才能启用六种日志记录:互 *** 作、加载程序、错误、网络、终结器和跟踪。请注意,默认情况下,Logging 下的子项并不存在。
可以通过将此值设置为 0(零)来关闭所有日志记录。
指定日志文件路径(可选)
将以下 Path 项的值设置为表示日志文件位置的字符串:
HKLM\Security\NETCompactFramework\Diagnostics\Logging\Path
此项只能通过可写入安全注册表的应用程序来访问。如果未指定路径,系统会将日志文件写入包含应用程序的目录。
在名称中包含应用程序(可选)
将以下 UseApp 项的值设置为 1:
HKLM\Software\Microsoft\NETCompactFramework\Diagnostics\Logging\UseApp
如果要运行多个应用程序并为每个应用程序获取单独的日志文件,则可以使用此项。如果有两个应用程序将日志文件写入同一目录,则当第二个应用程序运行时,较早的日志文件始终会被较新的日志文件覆盖。UseApp 项可以用作日志文件的区分符。
在名称中包含进程 ID(可选)
将以下 UsePid 项的值设置为 1:
HKLM\Software\Microsoft\NETCompactFramework\Diagnostics\Logging\UsePid
如果要多次运行同一个应用程序并为每个实例创建单独的日志,则可以使用此项。此设置会在日志文件名中添加进程 ID,以使应用程序的每个实例都能用不同的名称创建新日志文件。
在事件发生时记录事件(可选)
将以下 Flush 项的值设置为 1:
HKLM\Software\Microsoft\NETCompactFramework\Diagnostics\Logging\Flush
设置此值后,公共语言运行时 (CLR) 便会在事件发生时立即将日志事件写入日志文件,而不是先将事件保存在缓冲区中,并在写满缓冲区时才写入日志文件。此设置会给应用程序的性能带来负面影响,并可能稍稍修改应用程序的计时。但是,它有助于诊断与应用程序故障或其他错误有关的问题,因为您可能需要查看导致错误的最后几个事件。如果不存在或未设置此项,则系统将只有在写满缓冲区后,才会向日志文件写入数据。
#include <stdlibh>
#include <stringh>
#include <stdioh>
#include <direnth>
#include <timeh>
#define LOGFILE "/dir_log_0"
int g_Count;
//#define MAXLEN 1024
void WriteDebugLog(char str);
int main(int argc, char argv)
{
char str[1024]={0};
strcpy(str,"file no find");
int i=0,j=0;
for (i=0; i<10; i++)
{
for (j=0; j<50; j++)
{
WriteDebugLog(str);
}
}
return 0;
}
void WriteDebugLog(char str)
{
char buf[2048]={0};
char logFileName[50]={0};
//long MAXLEN = 5010241024;//50MB
int iMax = 1024;//1K
time_t timep;
FILE fp = NULL;
struct tm p;
time(&timep);
p = localtime(&timep);
memset(buf,0,sizeof(buf));
sprintf(buf,"[%d-%d-%d %d:%d:%d][DEBUG]",(1900+p->tm_year),(1+p->tm_mon), p->tm_mday,p->tm_hour, p->tm_min, p->tm_sec); //星期p->tm_wday
strcat(buf,str);
strcat(buf,"\r\n");
strcpy(logFileName,LOGFILE);
int len = strlen(logFileName);
logFileName[len-1] = '0'+g_Count;
fp = fopen(logFileName,"r");
if(fp==NULL)
{
fp = fopen(logFileName,"w+");
}
else
{
fseek(fp,0,2);//SEEK_END值为2
if( ftell(fp) >= iMax)
{
fclose(fp);
if (g_Count >= 9)
{
logFileName[len-1] = '0';
g_Count=0;
}
else
{
g_Count++;
logFileName[len-1] = '0'+g_Count;
// printf("\n%c",'0'+g_Count);
}
fp = fopen(logFileName,"w+");
}
else
{
fclose(fp);
fp = fopen(logFileName,"a");
}
}
fwrite(buf,1,strlen(buf),fp);
fclose(fp);
}
在写入日志条目时,系统使用您标识的源来查找适当的日志以放入您的条目。EventLog 组件实例一次只能向一个日志中写入项。说明:默认情况下,如果事先未将组件注册为有效的源就尝试写入日志项,系统会自动将该源注册到事件日志中,并将 Source 属性的值用作源字符串。通常在安装应用程序的过程中创建新的事件源。这样, *** 作系统就有时间刷新自己的已注册事件源的列表及其配置。如果 *** 作系统未刷新其事件源列表,而您试图用新的事件源来编写事件,则写 *** 作将失败。如果不能选择在安装过程中创建事件源,则请尝试在第一次写 *** 作之前尽早创建事件源,比如在应用程序初始化过程中创建。如果选择这种方法,请确保使用计算机上的管理员权限运行初始化代码。这些权限是创建新事件源所必需的权限。如果在使用 CreateEventSource 方法时指定了并不存在的日志名,系统将在您第一次尝试向日志中写入项时使用该名称创建一个新的、自定义的事件日志。有关更多信息,请参见 如何:创建和移除自定义事件日志。可以使用事件类别和消息字符串的本地化资源来注册事件源。应用程序可以使用资源标识符而不是通过指定实际字符串值来写入事件日志项。以下代码提供了一个示例:C#VB SystemDiagnosticsEventSourceCreationData creationData = new SystemDiagnosticsEventSourceCreationData("ApplicationName", "Application"); creationDataMachineName = "ServerName"; EventLogCreateEventSource(creationData); 请参见任务如何:确定事件源是否存在如何:移除事件源如何:创建和移除自定义事件日志演练:浏览事件日志、事件源和项概念EventLog 组件介绍参考EventLog
以上就是关于MFC/C++写的程序怎么让自己的程序写一个日志文件到一个地方, 或程序所在目录用clog行吗全部的内容,包括:MFC/C++写的程序怎么让自己的程序写一个日志文件到一个地方, 或程序所在目录用clog行吗、如何简单创建日志文件、求LINUX下,C语言编写的日志输出源码~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)