写操作系统的日志文件

现在做的项目中有这个功能,查了一整天才弄懂了点,没接触过,连资料也不好找。参照资料和自己所做的程序,写篇简易的文档。

写操作系统的日志文件

1. MC 为扩 展名 建一个包含消息描述的文本文件。 文件的格式非常特 别,简单介绍一下 具体 细节 Platform SDK 文档
 
基本格式:
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
 MessageId=xxx
 SymbolicName=IDS_EVT_MYDEFINE
 Language=English
 
 mydefine event string goes here.if there's parameters use %1 %2...
 .
 //must use . to end one event message define.
 
 MessageId=xxx//next block...
 .
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
如果使用中文,在文件最初定义
LanguageNames =(Chinese=0x804:MSG00804)//0x804 CodePage MSG00804 为定义文件名称( mc 输出的 .bin 文件)。然后替换基本格式中的 Language 字段,如下 Language=Chinese
 
说明:默认的语言是英语,此时"LanguageNames="那句可以省略;
%1,%2等表示从ReportEvent传来的参数;
注意注释时";"与";//"的不同用法.mc编译器会忽略";"后面的字符,但会把他们写到*.h文件里.
 
如果支持多种语言,则如下定义
LanguageNames=(English=0x409:MSG00409)
LanguageNames=(Chinese=0x411:MSG00411)
MessageId=0x1
Severity=Error
Facility=Runtime
SymbolicName=MSG_BAD_COMMAND
Language=English
You have chosen an incorrect command.
Language=Chinese
.
  ④ 文件必须以一个空行结束,即在最后一个信息定义块的 ' .' 后加回车换行
 
 
2. 使用 mc 编译此文件 .
mc.exe VC 带的工具 我装了 .NET ,路径 参考
C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/Tools/Bin
dos ,使用 mc 编译文件。如果你的项目使用 UNICODE ,如下: mc myevt.mc ;否则必须加入命令选项: mc myevt.mc -A 。将生成的三个文件 myevt.rc myevt.h MSG00804.bin
 
3 .制作好这三个文件之后。制作 DLL 。(只用过通过制作 DLL 的方法来写 log ,所以只记录这方面内容。)
vc 生成一个空 win32dll 框架 , 将生成的三个文件 编译。得到一个 DLL 文件。
 
4. 在注册表中添加自己的键: HKEY_LOCAL_MACHINE /SYSTEM/CurrentControlSet/Services/EventLog/Application/ myevt (自定) , 设上值: d:/ myevt .dll DLL 文件位置),可用 API 函数( RegCreateKeyEx RegSetValueEx )。
 
5. RegisterEventSource( NULL," myevt " ) 打开事件源,返回一句柄,然后以此句柄 ReportEvent ,即完成日志的写入。可在事件管理器中察看:右键我的电脑 管理 系统工具 事件视图。具体事件是属于“应用程序”,“系统”还是“安全”,则看 ReportEvent 时的参数了。
介绍完毕,非常混乱,附上自己做的实例,希望对大家有所帮助:
 
附录:
Ⅰ.mc 文件: MyEvent.mc
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
;//begin==============================================================
;#ifndef __ERRLOG_H__
;#define __ERRLOG_H__
LanguageNames=(Chinese=2052:MSG0052)
 
SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
               Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
               Warning=0x2:STATUS_SEVERITY_WARNING
               Error=0x3:STATUS_SEVERITY_ERROR
              )
 
MessageId=1000 Severity=Success SymbolicName=CM_ERR_LOG_FAILED
Language= Chinese
错误输出的内容是 :「%1」.
错误的原因是 :「%2」.
.
 
;#endif //__ERRLOG_H__
;//end================================================================
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
 
Ⅱ. 程序
#define KEY_NAME   _T("Acr_ErrLog") /* Key */
#define EVENT_ID   1000              /* 事件 ID */
#define ENTRY      _T("EventMessageFile")      /* 子键 */
#define REG_PATH   _T("SYSTEM//CurrentControlSet//Services//EventLog/
//Application// My_Event ")  /* 注册表路径 */
 
static int RegSet() ;
 
Main()
{
         char szTempMsg [10] = 文件打开出错 ;
         char szErr [10] = 没有权限 ;
 
          if ( ACR_RET_NORMAL == RegSet() )
         {
                   WriteEventLog( szTempMsg, szErr );
         }
}
 
/* 参照上面说明 4 :在注册表中添加自己的键, 设上值 */
int RegSet()
{
         HKEY     hkKey;
         LONG     lResult;                    /* 返回值           */
         DWORD    dwDisposition;              /* Key 是否已经存在的标志 */
         char     szFilePath[MAX_PATH];       /* DLL 文件的位置    */
 
         /* 打开指定的注册表 Key ,如果 Key 不存在的话新建一个 */
         lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
                   REG_PATH, /* 参照 define */
                   0,
                   NULL,
                   REG_OPTION_NON_VOLATILE,
                   KEY_ALL_ACCESS,
                   NULL,
                   &hkKey,
                   &dwDisposition );
 
         if( lResult )
         { 
                   return ACR_RET_SYSERROR;
         }
 
         /* DLL 文件路径取得 */
         GetAppPath( szFilePath );
          strcat( szFilePath, _T("//") );
          strcat( szFilePath, _T(" MyEvent .dll ") );
 
         /* 指定されたレジストリキーに所属する、
         指定されたレジストリエントリのデータを設定します。 */
         if( ERROR_SUCCESS != RegSetValueEx( hkKey,
                                  ENTRY, /* 参照 define */
                                  0,
                                  REG_EXPAND_SZ,
                                 (LPBYTE)szFilePath,
                                 (DWORD)_tcslen( szFilePath )+1) )
         {
                   return ACR_RET_SYSERROR;
         }
 
         RegCloseKey( hkKey );
         return ACR_RET_NORMAL;
}
 
/* 功能参照上面说明 5 。参数为要写入日志的内容, 1 为错误内容, 2 是错误原因 */
void WriteEventLog( char* szMsg, char* szErr )
{
         HANDLE hEventLog; 
         char *szEventLogArgs[2];    /* 写入的内容 */
 
         /* 内容处理 */
         if( NULL != szMsg )
         {
                   szEventLogArgs[0] = szMsg;
         }
         else
         {
                   szEventLogArgs[0] = _T("NULL");
         }
 
         if( NULL != szErr )
         {
                   szEventLogArgs[1] = szErr;
         }
         else
         {
                   szEventLogArgs[1] = _T("NULL");
         }
 
         /* 打开事件源 */
         hEventLog = RegisterEventSource( NULL, KEY_NAME );
 
         if( NULL != hEventLog )
         {
                   /* 内容写入 */
                   ReportEvent( hEventLog,
                            EVENTLOG_INFORMATION_TYPE,
                            0,
                            SPCM030_EVENT_ID,
                            NULL,
                            2,
                            0,
                            szEventLogArgs,
                            NULL );
         }
 
         DeregisterEventSource(hEventLog);
}
 

你可能感兴趣的:(.net,null,文档,dll,Parameters,Path)