监控log文件变化进行读出变化的内容供分析的源码类
来源:互联网 发布:nc 数据库修改凭证 编辑:程序博客网 时间:2024/05/22 04:44
监控log文件变化进行读出变化的内容供分析的源码类
头文件:
#pragma once//#define DEBUG_MONITORING_FILE_CHANGES#ifdef DEBUG_MONITORING_FILE_CHANGES#include "CiteConsole.h"#endif//定义获取到新的内容事件typedef void (CALLBACK* ONREADNEWCONTENT)(void* pOwner, const CString* strBuf, DWORD dwBufLen);class CLogFileMonitor{public:CLogFileMonitor(void);public:~CLogFileMonitor(void);/*--向上层的回调事件--*///读取到新的数据事件,回调函数ONREADNEWCONTENT OnReadNewContent;private://线程退出事件句柄HANDLE m_exitThreadEvent; //线程句柄HANDLE m_MonitoringThreadHandle;//父对象句柄void * m_pOwner;private:static DWORD WINAPI MonitoringThreadFunc(LPVOID lparam);BOOL Close();// 文件读取的成员和方法private:LONGLONG m_lOff; //记录读取的文件的位置ULONGLONG m_lActual;//seek实际到达的文件位置CString m_strFilePathName;CStdioFile m_file;BOOL m_blOpenSucess;void OpenFile();void ReadNewLine();public:void Init(CString strFileName, void* pOwner, void* OnReadNewContentFun);};
源文件#include "StdAfx.h"#include "LogFileMonitor.h"CLogFileMonitor::CLogFileMonitor(void){OnReadNewContent = NULL;m_pOwner = NULL;m_lOff = 0;m_lActual = 0;m_blOpenSucess =FALSE;//创建线程退出事件句柄CString strEventName;strEventName.Format(_T("EVENT_FILE_MONITOR_THREAD%d"), this);m_exitThreadEvent = CreateEvent(NULL,FALSE,FALSE, strEventName);//创建通讯线程m_MonitoringThreadHandle = CreateThread(NULL,0,MonitoringThreadFunc,this,0,NULL);}CLogFileMonitor::~CLogFileMonitor(void){Close();//关闭线程退出事件句柄CloseHandle(m_exitThreadEvent);Sleep(1000);if (m_blOpenSucess && m_file ){m_file.Close();printf("文件关闭");m_blOpenSucess = FALSE;}m_blOpenSucess =FALSE;}DWORD WINAPI CLogFileMonitor::MonitoringThreadFunc(LPVOID lparam){CLogFileMonitor *pThis = (CLogFileMonitor*)lparam;while (TRUE){//收到退出事件,结束线程if (WaitForSingleObject(pThis->m_exitThreadEvent,0) == WAIT_OBJECT_0){break;}pThis->ReadNewLine();}TRACE(L"CMonitoringFileChanges线程退出\n");return 0;}void CLogFileMonitor::Init(CString strFileName,void* pOwner, void* OnReadNewContentFun){m_strFilePathName = strFileName;m_pOwner = pOwner;OnReadNewContent = (ONREADNEWCONTENT)OnReadNewContentFun;}void CLogFileMonitor::OpenFile(){m_blOpenSucess = m_file.Open(m_strFilePathName, CFile::modeRead |CFile::shareDenyNone);if (!m_blOpenSucess){printf("监控log文件失败");}}void CLogFileMonitor::ReadNewLine(){if(!m_blOpenSucess){Sleep(100);OpenFile();if (!m_blOpenSucess){return;}}if (m_lOff != m_lActual){Sleep(200);}else{Sleep(300);}CString strText = _T("");CString szLine = _T("");if (m_file ==NULL){return;}if (!m_blOpenSucess){return;}if (m_file.m_pStream != NULL){m_lActual = m_file.Seek(m_lOff,CFile::begin);//逐行读取字符串while( m_file.ReadString( szLine ) ){if (m_pOwner && !szLine.IsEmpty()){OnReadNewContent(m_pOwner, &szLine, m_lActual);}szLine = _T("");}m_lOff = m_file.Seek(0, CFile::current);}}BOOL CLogFileMonitor::Close(){//发送通讯线程结束事件SetEvent(m_exitThreadEvent);//等待1秒,如果读线程没有退出,则强制退出if (WaitForSingleObject(m_MonitoringThreadHandle,1000) == WAIT_TIMEOUT){TerminateThread(m_MonitoringThreadHandle,0);TRACE(L"强制终止客户端线程\n");}m_MonitoringThreadHandle = NULL;//关闭文件,释放资源return TRUE;}
使用的时候,实现回调就可以在回调里面获取最新获取的变化量;
还有可以改进的思路就是:
每次都进行打开,并且每次都关闭,这样可以尽量不影响原来其他程序对log文件的操作。
0 0
- 监控log文件变化进行读出变化的内容供分析的源码类
- 工具类commons-io的Tailer用法,用来监控文件内容的变化情况
- 监控文件变化的三种方法
- Python监控Windows下的文件变化
- Java监控文件目录的变化
- 实时监控文件夹及文件的变化
- 关于监控文件变化的web工厂
- Nodejs监控文件内容变化并获取最新添加的内容
- linux之tail,监控文件内容变化
- Flume之监控文件内容变化
- 针对文件目录内容变化的检测
- 缓存文件变化 && WatchService监控文件变化分析
- 内容随着显示器的变化而变化
- Javascript实现输入内容变化的监控通知
- rails 数据变化的监控
- 监控文件夹里面的变化
- rails 数据变化的监控
- flume 1.7 新接口,监控文件内容变化,且监控目录内新增文件变化
- 批量修改mysql 表格字段编码
- ecshop库文件分页
- Android 监听键盘的弹出与关闭,收起
- 【MySQL性能优化】MySQL常见SQL错误用法
- ECSHOP全部品牌页实现分页换页功能方法
- 监控log文件变化进行读出变化的内容供分析的源码类
- Web安全核心书单
- Linux下date命令,格式化输出,时间设置
- Windows下php页面读取 mysql"中文数据"出现乱码的解决方法
- HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法区别
- 再探jQuery
- 关于sql中update语句响应条数为0的情况
- java的可变参数...
- iOS App 签名的原理