枚举
{
W3CLOG_date = 0 x00000001,
W3CLOG_time = 0 x00000002,
W3CLOG_c_ip = 0 x00000004,
W3CLOG_cs_username = 0 x00000008,
W3CLOG_s_sitename = 0 x00000010,
W3CLOG_s_computername = 0 x00000020,
W3CLOG_s_ip = 0 x00000040,
W3CLOG_s_port = 0 x00000080,
W3CLOG_cs_method = 0 x00000100,
W3CLOG_cs_uri_stem = 0 x00000200,
W3CLOG_cs_uri_query = 0 x00000400,
W3CLOG_sc_status = 0 x00000800,
W3CLOG_sc_win32_status = 0 x00001000,
W3CLOG_sc_bytes = 0 x00002000,
W3CLOG_cs_bytes = 0 x00004000,
W3CLOG_time_taken = 0 x00008000,
W3CLOG_cs_version = 0 x00010000,
W3CLOG_cs_host = 0 x00020000,
W3CLOG_cs_user_agent = 0 x00040000,
W3CLOG_cs_cookie = 0 x00080000,
W3CLOG_cs_referer = 0 x00100000,
W3CLOG_sc_substatus = 0 x00200000,
};
类CW3CLogHandler:
公共IltmsLogHandler
{
受保护的:
BOOL m_enable;
CAtlFile m_file;
DWORD m_fields;
BOOL m_localtime;
COleDateTime m_dtfile;
装运箱m_software;
装运箱m_folder;
装运箱m_prefix;
装运箱逃生(LPCOLESTR年代);
BOOL CreateLog(日期时间戳);
装运箱GetLogPath(日期时间戳);
HRESULT WriteString (LPCTSTR年代);
COleDateTime取得时间(日期时间戳);
HRESULT ResolvePath (LPCTSTR键,CString&解决);
公共:
CW3CLogHandler (LPCTSTR前缀= _T (“ltms_”),LPCTSTR软件= _T (“领导媒体服务器”),BOOL启用= TRUE, LPCTSTR文件夹= _T (“% ltmsLogFolder %”),字字段= 0 xfffffffful BOOL localtime = FALSE);
虚拟~ CW3CLogHandler (无效);
虚拟HRESULT STDMETHODCALLTYPE QueryInterface (/ * [在)* / REFIID riid, / * [iid_is][出]* / __RPC__deref_out无效__RPC_FAR * __RPC_FAR * ppvObject);
虚拟ULONG STDMETHODCALLTYPE AddRef (无效);
虚拟ULONG STDMETHODCALLTYPE版本(无效);
虚拟/ * [helpstring] [id] * / HRESULT STDMETHODCALLTYPE InitializeLog(日期时间戳);
虚拟/ * [helpstring] [id] * / HRESULT STDMETHODCALLTYPE TerminateLog (无效);
虚拟/ * [helpstring] [id] * / HRESULT STDMETHODCALLTYPE LogInformation (/ * [在]* / IltmsLogInformation *信息);
};
CW3CLogHandler:: CW3CLogHandler (LPCTSTR前缀,LPCTSTR软件、BOOL使LPCTSTR文件夹,DWORD字段,BOOL作用):m_fields(字段),
m_enable(启用),m_prefix(前缀),m_folder(文件夹),m_software(软件),m_localtime(本地时间)
{
}
CW3CLogHandler:: ~ CW3CLogHandler (无效)
{
}
HRESULT STDMETHODCALLTYPE CW3CLogHandler: QueryInterface (/ * [在)* / REFIID riid, / * [iid_is][出]* / __RPC__deref_out无效__RPC_FAR * __RPC_FAR * ppvObject)
{
如果(riid = = IID_IUnknown | | riid = = __uuidof (IltmsLogHandler))
{
* ppvObject = (无效*)(IltmsLogHandler *)这;
返回S_OK;
}
返回E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE CW3CLogHandler:: AddRef (无效)
{
返回1;
}
ULONG STDMETHODCALLTYPE CW3CLogHandler::释放(无效)
{
返回1;
}
HRESULT CW3CLogHandler: WriteString (LPCTSTR s)
{
CStringA t(年代);
返回m_file。写(t, t.GetLength ());
}
COleDateTime CW3CLogHandler:取得时间(日期时间戳)
{
COleDateTime dt(时间戳);
如果(m_localtime)
{
SYSTEMTIME timeUTC;
dt.GetAsSystemTime (timeUTC);
SYSTEMTIME timeLocal;
SystemTimeToTzSpecificLocalTime (NULL, &timeUTC &timeLocal);
dt = COleDateTime (timeLocal);
}
返回dt;
}
HRESULT CW3CLogHandler:: ResolvePath (LPCTSTR键,CString&解决)
{
HRESULT人力资源;
CComPtr < IltmsPathResolver >解析器;
hr = CoCreateInstance (__uuidof (ltmsPathResolver), NULL, CLSCTX_ALL, __uuidof (IltmsPathResolver), (无效* *)解析器);
如果(失败(人力资源)
返回人力资源;
CComBSTR v;
hr =解析器- >解决(CComBSTR(关键),增加了);
如果(失败(人力资源)
返回人力资源;
解决= v;
返回S_OK;
}
装运箱CW3CLogHandler: GetLogPath(日期时间戳)
{
COleDateTime dt =取得时间(时间戳);
装运箱fullpath;
HRESULT hr = ResolvePath (m_folder fullpath);
如果(失败(人力资源)
返回_T (”“);
fullpath + = _T (“\ \”);
fullpath + = m_prefix;
如果(m_localtime !)
fullpath + = dt.Format (_T (“% y % m % d % H % m % SUTC.log”));
其他的
fullpath + = dt.Format (_T (“% y % m % d % H % m % S.log”));
返回fullpath;
}
BOOL CW3CLogHandler: CreateLog(日期时间戳)
{
如果(m_file。m_h ! = NULL)
m_file.Close ();
如果(m_enable !)
返回虚假的;
HRESULT hr = m_file.Create (GetLogPath(时间戳),GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, OPEN_ALWAYS);
如果(失败(人力资源)
返回虚假的;
装运箱;
m_dtfile =取得时间(时间戳);
m_file。寻求(0,FILE_END);
s.Format (_T (“#软件:% s \ r \ n”),(LPCTSTR) m_software);
WriteString(年代);
WriteString (_T (“#版本:1.0 \ r \ n”));
COleDateTime dt =取得时间(时间戳);
s = dt.Format (_T (“#日期:Y % - % - % d % H: % m: % S \ r \ n”));
WriteString(年代);
s = _T (“#字段:“);
如果(m_fields & W3CLOG_date)
{
s + = _T (“日期”);
}
如果(m_fields & W3CLOG_time)
{
s + = _T (“时间”);
}
如果(m_fields & W3CLOG_s_sitename)
{
s + = _T (“s-sitename”);
}
如果(m_fields & W3CLOG_s_computername)
{
s + = _T (“s-computername”);
}
如果(m_fields & W3CLOG_s_ip)
{
s + = _T (“s-ip”);
}
如果(m_fields & W3CLOG_cs_method)
{
s + = _T (“cs方法”);
}
如果(m_fields & W3CLOG_cs_uri_stem)
{
s + = _T (“cs-uri-stem”);
}
如果(m_fields & W3CLOG_cs_uri_query)
{
s + = _T (“cs-uri-query”);
}
如果(m_fields & W3CLOG_s_port)
{
s + = _T (“s-port”);
}
如果(m_fields & W3CLOG_cs_username)
{
s + = _T (“cs-username”);
}
如果(m_fields & W3CLOG_c_ip)
{
s + = _T (“c-ip”);
}
如果(m_fields & W3CLOG_cs_version)
{
s + = _T (“cs-version”);
}
如果(m_fields & W3CLOG_cs_user_agent)
{
s + = _T (“cs(用户代理)”);
}
如果(m_fields & W3CLOG_cs_cookie)
{
s + = _T (“cs(饼干)”);
}
如果(m_fields & W3CLOG_cs_referer)
{
s + = _T (“cs(推荐人)”);
}
如果(m_fields & W3CLOG_cs_host)
{
s + = _T (“cs-host”);
}
如果(m_fields & W3CLOG_sc_status)
{
s + = _T (“sc-status”);
}
如果(m_fields & W3CLOG_sc_substatus)
{
s + = _T (“sc-substatus”);
}
如果(m_fields & W3CLOG_sc_win32_status)
{
s + = _T (“sc-win32-status”);
}
如果(m_fields & W3CLOG_sc_bytes)
{
s + = _T (“sc-bytes”);
}
如果(m_fields & W3CLOG_cs_bytes)
{
s + = _T (“cs-bytes”);
}
如果(m_fields & W3CLOG_time_taken)
{
s + = _T (“时间”);
}
s + = _T (“\ r \ n”);
WriteString(年代);
m_file.Flush ();
返回真正的;
}
装运箱CW3CLogHandler:逃避(LPCOLESTR s)
{
CStringW t;
为(;*年代;+ +)
{
如果(iswprint (*) & & ! iswspace (*))
t + = *年代;
其他的
t + = L“+”;
}
返回装运箱(t);
}
HRESULT STDMETHODCALLTYPE CW3CLogHandler: InitializeLog(日期时间戳)
{
CreateLog(时间戳);
返回S_OK;
}
HRESULT STDMETHODCALLTYPE CW3CLogHandler:: TerminateLog (无效)
{
如果(m_file。m_h ! = NULL)
m_file.Close ();
返回S_OK;
}
HRESULT STDMETHODCALLTYPE CW3CLogHandler: LogInformation (/ * [在)* / IltmsLogInformation *信息)
{
装运箱;
如果(m_enable !)
返回S_OK;
/ /检查是否我们需要将一个新文件
{
日期v;
信息- > get_TimeStamp(增加了);
COleDateTime dt =取得时间(v);
如果(m_file。m_h = = NULL | | dt.GetDay () ! = m_dtfile.GetDay ()
| | dt.GetMonth () ! = m_dtfile.GetMonth ()
| | dt.GetYear () ! = m_dtfile.GetYear ())
{
如果(! CreateLog (v))
返回S_OK;
}
}
如果(m_fields & W3CLOG_date)
{
日期v;
信息- > get_TimeStamp(增加了);
COleDateTime dt =取得时间(v);
如果(! s.IsEmpty ())
s + L =”“;
s + = dt.Format (_T (“Y % - % - % d”));
}
如果(m_fields & W3CLOG_time)
{
日期v;
信息- > get_TimeStamp(增加了);
COleDateTime dt =取得时间(v);
如果(! s.IsEmpty ())
s + = _T (”“);
s + = dt.Format (_T (“M % H: %: % S”));
}
如果(m_fields & W3CLOG_s_sitename)
{
CComBSTR v;
信息- > get_SiteName(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_s_computername)
{
CComBSTR v;
信息- > get_ComputerName(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_s_ip)
{
CComBSTR v;
信息- > get_ServerIP(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + = v;
}
如果(m_fields & W3CLOG_cs_method)
{
CComBSTR v;
信息- > get_Method(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_cs_uri_stem)
{
CComBSTR v;
信息- > get_URIStem(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_cs_uri_query)
{
CComBSTR v;
信息- > get_URIQuery(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_s_port)
{
长v;
信息- > get_ServerPort(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
装运箱t;
t.Format (_T (“% u”),(单位)v);
s + = t;
}
如果(m_fields & W3CLOG_cs_username)
{
CComBSTR v;
信息- > get_UserName(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_c_ip)
{
CComBSTR v;
信息- > get_ClientIP(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(s.IsEmpty ())
s + = _T (“-”);
其他的
s + = v;
}
如果(m_fields & W3CLOG_cs_version)
{
CComBSTR v;
信息- > get_ProtocolVersion(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_cs_user_agent)
{
CComBSTR v;
信息- > get_UserAgent(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_cs_cookie)
{
CComBSTR v;
信息- > get_Cookie(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_cs_referer)
{
CComBSTR v;
信息- > get_Referrer(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_cs_host)
{
CComBSTR v;
信息- > get_Host(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v.Length () = = 0)
s + = _T (“-”);
其他的
s + =逃脱(v);
}
如果(m_fields & W3CLOG_sc_status)
{
长v;
信息- > get_Status(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
装运箱t;
t.Format (_T (“% u”),(单位)v);
s + = t;
}
如果(m_fields & W3CLOG_sc_substatus)
{
长v;
信息- > get_ProtocolSubStatus(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
装运箱t;
t.Format (_T (“% u”),(单位)v);
s + = t;
}
如果(m_fields & W3CLOG_sc_win32_status)
{
长v;
信息- > get_Win32Status(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
装运箱t;
t.Format (_T (“% u”),(单位)v);
s + = t;
}
如果(m_fields & W3CLOG_sc_bytes)
{
长v;
信息- > get_BytesSent(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v < 0)
{
s + = _T (“-”);
}
其他的
{
装运箱t;
t.Format (_T (“% u”),(单位)v);
s + = t;
}
}
如果(m_fields & W3CLOG_cs_bytes)
{
长v;
信息- > get_BytesReceived(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v < 0)
{
s + = _T (“-”);
}
其他的
{
装运箱t;
t.Format (_T (“% u”),(单位)v);
s + = t;
}
}
如果(m_fields & W3CLOG_time_taken)
{
长v;
信息- > get_TimeTaken(增加了);
如果(! s.IsEmpty ())
s + = _T (”“);
如果(v < 0)
{
s + = _T (“-”);
}
其他的
{
装运箱t;
t.Format (_T (“% u”),(单位)v);
s + = t;
}
}
s + = _T (“\ r \ n”);
WriteString(年代);
m_file.Flush ();
返回S_OK;
}
HRESULT RunServerWithLogging (无效)
{
CComPtr < IltmsServer >服务器;
HRESULT人力资源;
CW3CLogHandler loghandler;
/ /创建一个服务器对象的实例
hr = CoCreateInstance (__uuidof (ltmsServer), NULL, CLSCTX_ALL, __uuidof (IltmsServer), (无效* *)及服务器);
如果(失败(人力资源)
转到错误;
/ /设置日志处理程序
hr =服务器- > putref_LogHandler (&loghandler);
如果(失败(人力资源)
转到错误;
{
/ /用于演示,比较我们设置的接口
CComPtr < IltmsLogHandler > ihandler;
hr =服务器- > get_LogHandler (&ihandler);
如果(失败(人力资源)
转到错误;
如果(ihandler ! = (IltmsLogHandler *) &loghandler)
{
hr = E_UNEXPECTED;
转到错误;
}
}
/ /加载配置文件位于配置文件夹下的可执行文件的文件夹
/ /或注释本节运行服务器的默认设置
人力资源管理- > ImportConfigFile (CComBSTR (L =服务器“% ltmsConfigFolder % \ \ ltmsServer.xml”));
如果(失败(人力资源)
转到错误;
/ /启动服务器
hr =服务器- > Start ();
如果(失败(人力资源)
转到错误;
/ /显示一条消息,服务器正在运行,等待一个关键
_tprintf (_T (“服务器已经开始。按任意键停止。\ n”));
_gettc (stdin);
/ /停止服务器
hr =服务器- >停止();
如果(失败(人力资源)
转到错误;
/ /删除日志处理程序
hr =服务器- > putref_LogHandler(空);
如果(失败(人力资源)
返回人力资源;
错误:
返回人力资源;
}