项目中用log4z 输出日志,相比glog而言,log4z 可以格式化ANSI和unicode ,因为log4z 最终还是调用 _snprintf_s:
#define LOG_FORMAT(id, level, file, line, logformat, ...) \
do{ \
if (zsummer::log4z::ILog4zManager::getPtr()->prePushLog(id,level)) \
{\
zsummer::log4z::LogData * __pLog = zsummer::log4z::ILog4zManager::getPtr()->makeLogData(id, level); \
int __logLen = _snprintf_s(__pLog->_content + __pLog->_contentLen, LOG4Z_LOG_BUF_SIZE - __pLog->_contentLen, _TRUNCATE, logformat, ##__VA_ARGS__); \
if (__logLen < 0) __logLen = LOG4Z_LOG_BUF_SIZE - __pLog->_contentLen; \
__pLog->_contentLen += __logLen; \
zsummer::log4z::ILog4zManager::getPtr()->pushLog(__pLog, file, line); \
}\
} while (0)
可以使用%ws,直接输出unicode信息。但是当unicode中包含中文时,会转换失败。因为_snprintf_s 内部会调用wctomb_s 进行字符串转换,直接转换中文会失败。
bool write_stored_string_tchar(char) throw()
{
if (_string_is_wide && _string_length > 0)
{
wchar_t* p{_wide_string};
for (int i{0}; i != _string_length; ++i)
{
char local_buffer[MB_LEN_MAX + 1];
int mbc_length{0};
errno_t const status{wctomb_s(&mbc_length, local_buffer, _countof(local_buffer), *p++)};
if (status != 0 || mbc_length == 0)
{
_characters_written = -1;
return true;
}
_output_adapter.write_string(local_buffer, mbc_length, &_characters_written, _cached_errno);
}
}
else
{
_output_adapter.write_string(_narrow_string, _string_length, &_characters_written, _cached_errno);
}
return true;
}
调用wctomb_s 转换中文前,需要调用setlocale(LC_ALL,"Chinese-simplified");//在wcstombs_s之前设置 支持中文字符。
参考资料:https://bbs.csdn.net/topics/390468961