I.概要
この記事では、Windowsプラットフォームのアプローチでシンプルなロギングシステムを実装するためのC ++の使用を記載しています。次のようにシステムログの特長:
C言語のprintfスタイルに似1.サポート出力は、可変パラメータをサポートします。
2.画面とログファイルに出力をサポートします。
システム時刻を印刷3.サポート。
4.セキュリティスレッドは、各スレッドが同時にログを書き込むことができます。
第二に、実装
次のようにコードは次のとおりです。
AfMutex.h
#ifndef _OSAPI_MUTEX_H
#define _OSAPI_MUTEX_H
struct AfMutex_Priv;
//互斥锁相关的类
class AfMutex
{
public:
AfMutex();
~AfMutex();
int Lock();
int TryLock();
void Unlock();
private:
int Init();
private:
AfMutex_Priv *m_Priv;
};
AfMutex_Win32.cpp
#include "AfMutex.h"
#ifdef _WIN32
#include <windows.h>
struct AfMutex_Priv
{
HANDLE hMutex;
};
AfMutex::AfMutex()
:m_Priv(NULL)
{
Init();
}
AfMutex::~AfMutex()
{
if(m_Priv)
{
CloseHandle(m_Priv->hMutex);
delete m_Priv;
}
}
int AfMutex::Init()
{
m_Priv = new AfMutex_Priv;
m_Priv->hMutex = CreateMutex(NULL, true, NULL);
if(m_Priv->hMutex == NULL)
{
delete m_Priv;
m_Priv = NULL;
return -1;
}
ReleaseMutex(m_Priv->hMutex);
return 0;
}
int AfMutex::Lock()
{
if(!m_Priv) return -1;
WaitForSingleObject(m_Priv->hMutex, INFINITE);
return 0;
}
int AfMutex::TryLock()
{
if(!m_Priv) return -1;
DWORD ret = WaitForSingleObject(m_Priv->hMutex, 1);
if( ret == WAIT_OBJECT_0)
{
return 0; // success
}
if( ret == WAIT_TIMEOUT)
{
return -1; // timeout
}
return -1;
}
void AfMutex::Unlock()
{
if(!m_Priv) return;
ReleaseMutex(m_Priv->hMutex);
}
#endif
Clog.h
#ifndef CLOG_H
#define CLOG_H
#include <stdio.h>
#include <ctime>
#include <stdarg.h>
#include "AfMutex.h"
//日志相关的类
class CLog
{
public:
CLog(void)
{
;
}
public:
static CLog *i() //单例模式
{
static CLog c_log;
return &c_log;
}
void InitLog(const char *log_dir) //打开log_dir目录下的日志文件,如果该文件不存在,则创建它
{
char filePath[100] = { 0 };
time_t now = time(0);
tm *ltm = localtime(&now);
sprintf(filePath, "%s/%04d-%02d-%02d_%02d%02d%02d.log", log_dir, 1900 + (ltm->tm_year), 1 + (ltm->tm_mon), ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec);
m_fp = fopen(filePath, "a"); //以附加的方式打开只写文件filePath。使用fopen打开的文件是共享的,即使不关闭文件指针,其它文件也可以访问该文件
if (NULL == m_fp)
{
printf("can not open log file: %s/n", filePath);
}
}
void WriteLog(const char *msg ...) //将信息msg写入到文件指针为m_fp的日志文件中,并打印到控制台上(支持ANSI,格式化输出)
{
m_mutex.Lock();
char buf[1024] = { 0 };
char t_buf[50] = { 0 };
time_t now = time(0);
tm *ltm = localtime(&now);
sprintf(t_buf, "<%d年%d月%d日%d时%d分%d秒>:", 1900 + (ltm->tm_year), 1 + (ltm->tm_mon), ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec, msg);
printf("%s", t_buf);
fprintf(m_fp, "%s", t_buf);
va_list vp;
va_start(vp, msg);
vfprintf(stdout, msg, vp);
vfprintf(m_fp, msg, vp);
va_end(vp);
fflush(m_fp);
m_mutex.Unlock();
}
private:
FILE *m_fp; //日志文件的文件指针
AfMutex m_mutex; //互斥锁
};
#endif
main.cppに
#include "Clog.h"
#include <stdio.h>
using namespace std;
int main()
{
CLog::i()->InitLog("log");
char *buf = "xiaoming";
CLog::i()->WriteLog("name:%s\n", buf);
return 0;
}
第三に、営業成績
当社は、以下に示すように、プロジェクトディレクトリ下のログディレクトリを作成し、上記のコードを追加し、コンソールプロジェクト(例えばvs2015など)対で作成しました:
その後、我々はすでにそれを見ることができるコンソールでログ情報をプリントアウトすることができ、コンパイルして実行します。
ログディレクトリのに合わせてプログラムを起動する時に対応するログファイルを生成します。
IVの概要
この記事では、ログに持っているログの唯一の最も基本的な機能を発揮します。それは、サーバー上にある場合、また検討し、本番環境のログでの実際の使用は、正確なソースのトレーサビリティ、ログ出力レベルをサポートするかどうか、ログの支援プログラムフォールト例外出口を保存する時に、このような性能ログなど多くの問題を、検討すべきですログサポート交代など(ファイルの原因になります何のサーバーに障害が再起動していないされていない、ログファイルに半年が大きすぎます)。だから、このプロジェクトでは、私たちだけではないかもしれない不完全な自分の車を作った、特に同社のプロジェクトで、(などlog4cpp、boost.log、spdlog、glog、ZLOG、など)既存のオープンソースのライブラリの使用を優先するのではなく、ログを達成しよう、使用することは容易ではありません。
第五に、参照リンク
コード部分ミューテックスは、本明細書中下記リンクからなる教師シャオコードを参照する使用しました。
https://download.csdn.net/download/iamshaofa/4303875