如何将Unicode文本写到日志文件中
有时为了定位问题,我们需要结合打印日志来处理。特别是较难复现的,一般都需要查看上下文日志才能找出可能存在的问题。考虑到程序要在不同语言的操作系统上运行,程序界面显示要支持Unicode,打印出来的日志也要支持Unicode,即将运行日志以Unicode文本写到日志文件中。
那么如何才能将Unicode文本写到日志文件中呢?只要我们调用Unicode版本的写入函数,传入Unicode字符串就能实现写入了吗?试一试便知道,仅仅这样肯定实现不了的。经实际调试和使用,只要满足下面几点即可:
1、文件以二进制方式打开;
2、写入Unicode文本标识头:0xFFFE;
3、调用Unicode版本的写入函数,传入Unicode字符串;
4、如果打印日志中要换行,仅仅\n是不行的,要用\r\n。
下面分别给出两个版本的参考源码:
1、C函数写日志示例代码:
void WriteLog( LPCTSTR pszLog, LPCTSTR pszFilePath )
{
if ( pszLog == NULL || pszFilePath == NULL )
{
return;
} BOOL bFileExsit = PathFileExists( pszFilePath ); LPCTSTR pszMode = NULL;
#ifdef _UNICODE
pszMode = _T("ab+"); // 对于Unicode,要向文件中写入Unicode文字,必须以二进制方式打开
#else
pszMode = _T("a+");
#endif FILE* pFile;
pFile = _tfopen( pszFilePath , pszMode );
if( NULL == pFile )
{
return;
} if ( !bFileExsit )
{
// 新创建的日志文件,则写入Unicode头
BYTE chUnicodeHead[2] = { 0xff, 0xfe }; // Unicode头
fwrite( chUnicodeHead, sizeof(BYTE), sizeof(chUnicodeHead), pFile );
} SYSTEMTIME time;
::GetLocalTime( &time );
_ftprintf( pFile, _T("%04d-%02d-%02d %02d:%02d:%02d %s\r\n"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, pszLog );
fclose( pFile ); return;
}
2、MFC中的CStdioFile示例:
void WriteLog( LPCTSTR pszLog, LPCTSTR pszFilePath )
{
if ( pszLog == NULL || pszFilePath == NULL )
{
return;
} CStdioFile logFile;
CFileException ex; BOOL bFileExsit = PathFileExists( pszFilePath );
UINT uOpenFlag = CFile::shareDenyNone | CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate;
#ifdef _UNICODE
uOpenFlag |= CFile::typeBinary; // 对于Unicode版本,要写入Unicode文字,所以要设置CFile::typeBinary标记
#endif BOOL32 bRet = logFile.Open( pszFilePath, uOpenFlag, &ex );
if ( bRet )
{
#ifdef _UNICODE
// 对于新建的文件,为了向文件中写入Unicode文字,要写写入Unicode头
if ( !bFileExsit )
{
flog.SeekToEnd();
WORD unicodeFlag = 0xFEFF; // 文件采用unicode格式
flog.Write( (void*)&unicodeFlag, sizeof(WORD) );
}
#endif flog.SeekToEnd(); flog.WriteString( achPrintBuf );
flog.Close();
}
}
如何将Unicode文本写到日志文件中的更多相关文章
- 【转】如何把Json格式字符写进text文件中
http://www.cnblogs.com/insus/p/4306640.html http://json2csharp.chahuo.com/ 本篇一步一步学习怎样把显示于网页的json格式的字 ...
- 如何把Json格式字符写进text文件中
本篇一步一步学习怎样把显示于网页的json格式的字符串写进text文件中,并保存起来.学习到创建model, Entity, 序列化List<object>转换为json,显示于网页上.然 ...
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...
- Shell 从日志文件中选择时间段内的日志输出到另一个文件
Shell 从日志文件中选择时间段内的日志输出到另一个文件 情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便.所以,相关人员希望能够查询某个时间 ...
- Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中
Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中 在Linux系统中,Tomcat 启动后默认将很多信息都写入到 catalina.out 文件中,我们可以通过tail ...
- 将JSON对象带有格式的写出到文件中
需求:将一个JSON对象写出到文件中,要求文件中的JSON数据带有简单的格式.代码的实现参考了Java算法中的栈处理括号匹配问题.好了,不多说了,下面是代码的实现. 代码: package gemu. ...
- delegate 集成在类中,还是单独写在.h文件中?
转:http://stackoverflow.com/questions/11382057/declaring-a-delegate-protocol There definitely are sub ...
- 使用python脚本实现统计日志文件中的ip访问次数
使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...
- jstack Dump 日志文件中的线程状态
[转]jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condi ...
随机推荐
- 【C#】Visual Studio 2017 一边Debug,一边修改代码
好久没写C#了,最近在学习著名***工具 shadowsocks-windows 的源代码,想着可以边断点调试,边加上一些注释以方便理解,stackoverflow 和 msdn 随便翻了一下,竟发现 ...
- maven 引入外部jar包的几种方式(转)
原文链接: maven 引入外部jar包的几种方式 方式1:dependency 本地jar包 <dependency> <groupId>com.hope.cloud< ...
- phpstorm10使用服务激活
现在官网已经更新到WebStorm 11.PhpStorm 10,找到一个很便捷的方法,不需要注册码了.安装完成,打开软件看到输入注册码界面的时候,切换到第二个选项,输入:http://idea.la ...
- Postgres空间地理类型POINT POLYGON实现附近的定位和电子围栏功能
目录 需求和背景 安装插件postgis 点POINT类型和距离 表添加POINT类型 添加空间索引 插入点 两个点之间的距离 附近5公里内的点 最近的10个点 面多边形'POLYGON' 添加字段类 ...
- WPF 使用HttpListener搭建本地web服务器
准备工作 using Micro.Listener 类(Micro.Listener.dll)下载 调用示例:一.启动服务:new Micro.Listener.ListenerSync(8080). ...
- Centos7安装Tomcat并部署DubboAdmin的War包并配置自动启动
一.安装过程 1.打开官网,在左侧选择要下载的版本,比如下下载Tomcat8:https://tomcat.apache.org/download-80.cgi 2.找到tar.gz的下载地址:htt ...
- vim Google style format
https://github.com/google/vim-codefmt https://github.com/rhysd/vim-clang-format http://pre.tir.tw/00 ...
- cache line 伪共享
https://blog.csdn.net/qq_27680317/article/details/78486220认识CPU Cache CPU Cache概述 随着CPU的频率不断提升,而内存的访 ...
- android开发之打包签名
android开发之数字签名 http://www.cnblogs.com/fengzhblog/archive/2013/05/06/3063104.html Android系统要求所有的程序经过数 ...
- 书记查询的App设计
表示学习Andriod没有头绪,看书看着看着都觉得大部分是些item的介绍,看过去之后会完全忘记,还是自己做个小东西进行实际开发学习和掌握起来会比较快. PC端的软件已经做好,当然因为PC屏幕较大,手 ...