c++日志练习

使用ostream流创建写入log日志文件

使用宏 配置文件大小和间隔时间  当创建文件时间间隔或文件大小大于指定数字 则创建新文件

文件名由时间自动命名

/**************************************************************

技术博客

http://www.cnblogs.com/itdef/

技术交流群
群号码:324164944

欢迎c c++ windows驱动爱好者 服务器程序员沟通交流

**************************************************************/

#include "stdafx.h"
#include "StreamLog.h"
#include <sstream>

namespace DEFTOOLS {
    LogFile::LogFile():pOfsLogFile_(NULL){
        filePath_ = "";
        fileName_ = filePath_ + MakeFileName();
    }

    LogFile::LogFile(const std::string& filePath): pOfsLogFile_(NULL){
        filePath_ = filePath;
        fileName_ = filePath_ + MakeFileName();
    }

    const std::string LogFile::MakeFileName() {
        struct tm t = tm_.GetCurrentDataTime();
        std::stringstream s;
        std::string str;
        s << t.tm_year + 1900 << "_" << t.tm_mon + 1 << "_"
            << t.tm_mday << "_" << t.tm_hour << "_" <<
            t.tm_min << "_" << t.tm_sec << ".log";
        s >> str;
        return str;
    }
    bool LogFile::CreateFile() {
        bool bRet = false;
        try {
            pOfsLogFile_ = new std::ofstream(fileName_.c_str(), std::ios_base::app);
            if (NULL == pOfsLogFile_ || pOfsLogFile_->bad())
            {
                pOfsLogFile_ = NULL;
                std::exception e("open ofstream error");
                throw e;
            }
            tm_.SetBeginTime();
            bRet = true;
        }
        catch (const std::exception& error)
        {
            std::cerr << error.what() << std::endl;
        }

        return bRet;
    }

    bool LogFile::InitFunc() {
        return CreateFile();
    }

    LogFile::~LogFile(){
        if (NULL != pOfsLogFile_)
        {
            pOfsLogFile_->close();
            delete pOfsLogFile_;
        }
    }

    void LogFile::CheckFile() {
        tm_.SetEndTime();
        if ((tm_.GetDeltaTime() > DEFAULT_DELTA_TIME) ||
            GetFileSize() > DEFAULT_FILE_SIZE) {
            if (NULL != pOfsLogFile_) {
                pOfsLogFile_->close();
                delete pOfsLogFile_;
                pOfsLogFile_ = NULL;
            }
            fileName_ = filePath_ + MakeFileName();
            CreateFile();
        }
    }

    const std::string LogFile::GetCurrentTimeString()
    {
        struct tm t = tm_.GetCurrentDataTime();
        std::stringstream s;
        std::string str;
        std::string strTime;
        s << t.tm_year + 1900 << "-" << t.tm_mon + 1 << "-"
            << t.tm_mday;
        s >> str;
        s.clear();
        s << t.tm_hour << ":" <<
            t.tm_min << ":" << t.tm_sec << "\t\t";
        s >> strTime;

        str += " ";
        str += strTime;
        return str;
    }

    std::string  LogFile::GetLevelString(const WriteLevel wl) {
        std::string levelStr;
        switch (wl)
        {
        case NORMAL_L:
            levelStr = "[normal ]\t";
            break;
        case WARNING_L:
            levelStr = "[warning]\t";
            break;
        case ERROR_L:
            levelStr = "[error  ]\t";
            break;
        case UNKNOWN_L:
            levelStr = "[unknown]\t";
            break;
        default:
            levelStr = "[???????]\t";
            break;
        }
        return levelStr;
    }

    bool LogFile::WriteLog( std::string wrtieStr, const WriteLevel wl) {
        bool bRet = false;
        CheckFile();
        if (!pOfsLogFile_) {
            return bRet;
        }
        (*pOfsLogFile_) << GetCurrentTimeString() << GetLevelString(wl) << wrtieStr << std::endl;
        bRet = true;
        return bRet;
    }

}//namespace DEFTOOLS 

#pragma once

#include <time.h>
#include <string>
#include <fstream>
#include <iostream>
#include <string>

namespace DEFTOOLS {
#define DEFAULT_DELTA_TIME            (60*2)    //日志切换时间
#define DEFAULT_FILE_SIZE            (1024*1024*1024)        //日志切换文件大小

    typedef enum WRITE_LEVEL
    {
        NORMAL_L = 0,
        WARNING_L,
        ERROR_L,
        UNKNOWN_L
    }WriteLevel;

    // Time 管理时间及时间差 以及年月日
    class LogTime {
    public:
        LogTime() :timeBegin_(time(NULL)), timeEnd_(time(NULL)) {
            time_t t = time(NULL);
            localtime_s(&tm_, &t);
        }

        void SetBeginTime() { timeBegin_ = time(NULL); }
        void SetEndTime() { timeEnd_ = time(NULL); }

        time_t GetBeginTime() { return timeBegin_; }
        time_t GetEndTime() { return timeEnd_; }
        time_t GetDeltaTime() { return timeEnd_ - timeBegin_; }
        struct tm GetCurrentDataTime() {
            time_t t = time(NULL);
            localtime_s(&tm_, &t);
            return tm_;
        };
    private:
        time_t timeBegin_;
        time_t timeEnd_;
        struct tm tm_;
    };

    class LogFile {
    public:
        LogFile();
        LogFile(const std::string& filePath);
        virtual ~LogFile();
        bool InitFunc();
        std::streampos GetFileSize() { if (!pOfsLogFile_) { return 0; }return pOfsLogFile_->tellp(); };
        void CheckFile();
        bool WriteLog(const std::string wrtieStr, const WriteLevel wl = NORMAL_L);
        //============================
        void WriteFileTest() {
            CheckFile();
            if (!pOfsLogFile_){
                return;
            }
            (*pOfsLogFile_) << "测试1234" << std::endl;
        }
        //============================
    private:
        bool CreateFile();
        const std::string GetCurrentTimeString();
        const std::string MakeFileName();
        std::string  LogFile::GetLevelString(const WriteLevel wl);
        std::string fileName_;
        std::string filePath_;
        std::ofstream* pOfsLogFile_;
        LogTime    tm_;
    };

}//namespace DEFTOOLS 

时间: 2024-11-08 19:55:40

c++日志练习的相关文章

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

MySQL binlog日志恢复数据

我们了解了MySQL 的 binlog 日志的开启方式以及 binlog 日志的一些原理和常用操作,我们知道,binlog 有两大作用,一个是使用 binlog 恢复数据,另一个就是用来做主从复制.本篇笔记就是来记录如何使用 binlog 日志来做数据恢复.当然了,使用 binlog 日志所恢复的数据只能是部分数据,并不能够使用 binlog 日志来做数据库的备份,如果想要做数据库备份,依然要使用我们传统的备份方法,而 binlog 可以作为增量备份. 视频链接:http://www.ronco

sparkStreaming结合sparkSql进行日志分析

package testimport java.util.Propertiesimport org.apache.spark.SparkConfimport org.apache.spark.SparkContextimport org.apache.spark.sql.{SQLContext, SaveMode}import org.apache.spark.streaming.Secondsimport org.apache.spark.streaming.StreamingContext

ELK 日志分析系统

架构如下,logstash-agent ---->redis---->logstash-server----->elasticsearch---->kibana 需求:想收集多个log文件,例如/var/log/messages,  /var/log/logstash/logstash.err  两个日志文件: logstash     input和output  如何写, input { file  { path => "/var/log/messages&quo

log4j日志基本配置

Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用

【Docker常见问题2】如何设置容器日志大小和保留个数

举例:当tomcat容器的运行,容器占用空间越来越大,约1个月就会超过2G,如何解决? 步骤1:查看容器日志大小:假设容器目录为/var/lib/docker/containers,那么执行如下命令 cd /var/lib/docker/containers  #进入默认容器空间目录 du -sh *            #统计文件大小2.4G  de92a5643f7ffb106f8abba21fc0f93996842917a52879153adc95a73312934a-json.log

ABP官方文档翻译 4.6 审计日志

审计日志 介绍 关于IAuditingStore 配置 通过特性启用/禁用 注意事项 介绍 维基百科:“审计追踪(也称为审计日志)是与安全相关的按时间先后的记录.记录集合.记录的目的地和源,提供一系列活动的纪实证据,这些活动可能在任何时刻影响一个特定操作.过程或事件.” ABP提供了基础设施自动记录应用所有的交互.它可以记录方法调用的调用者和参数. 基本上,保存的字段有:相关的tenant id,调用者user id,调用者service name(调用方法的类),调用者method name,

Log4j日志框架

引入依赖 在maven远程仓库引入依赖 <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> 配置文件 在 src/main/resources 目录下新建配置文件

日志应该满足的要求

中文: 时间戳-  表示事件何时发生 格式化- 日志行应该容易让人理解,同时便于程序解析 日志地点- 它应该是标准输出和错误,应用不需要关心日志的地点 日志等级- 日志事件应该有不同的服务等级,大部分情况下我们比较关心debug 和info 级别的事件 英文: timestamps - it is crucial to know which event happened when, formatting - log lines must be easily understandable by h

前端学HTTP之日志记录

前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两种原因:査找服务器或代理中存在的问题(比如,哪些请求失败了),或者是生成Web站点访问方式的统计信息.统计数据对市场营销.计费和容量规划(比如,决定是否需要增加服务器或带宽)都非常有用 可以把一个HTTP事务中所有的首部都记录下来,但对每天要处理数百万个事务的服务器和代理来说,这些数据的体积超大,很