zoukankan      html  css  js  c++  java
  • 兼容windows与linux的写日志代码

    以下代码可在windows与linux上正确编译和执行。

    日志按照QQ号和日期为单位分类进行存放,可防止不同QQ号的日志混放在一起,以及日志随着时间逐渐变大等问题。

     1 #include <stdio.h>
     2 #include <stdarg.h>
     3 #include <time.h>
     4 
     5 #ifdef WIN32
     6 #include <direct.h>
     7 #include <io.h>
     8 #else
     9 #include <stdarg.h>
    10 #include <sys/stat.h>
    11 #include <unistd.h>
    12 #endif
    13 
    14 typedef unsigned int UINT;
    15 
    16 void PrintDebugMsg(UINT uin, const char* msg, ...)
    17 {
    18 // 非debug版本,直接返回
    19 #ifndef DEBUG
    20     return;
    21 #endif
    22 
    23     char szMessage[1024] = { 0 };
    24     va_list pArg;
    25     va_start(pArg, msg);
    26 #ifdef WIN32
    27     _vsnprintf(szMessage, 1023, msg, pArg);
    28 #else
    29     vsnprintf(szMessage, 1023, msg, pArg);
    30 #endif    
    31     va_end(pArg);
    32     
    33     time_t nNowTime = time(NULL); 
    34     tm *pDate    = localtime(&nNowTime);
    35     if (pDate==NULL) return;
    36     
    37     int nYear = 1900 + pDate->tm_year;
    38     int nMonth = pDate->tm_mon+1;
    39     int nDay = pDate->tm_mday;
    40     int nHour = pDate->tm_hour;
    41     int nMin  = pDate->tm_min;
    42     int nSec  = pDate->tm_sec;
    43 
    44     // 日志按QQ和天来存放
    45     
    46     char* pDirPath = NULL;
    47     char szLogPath[1024] = { 0 };
    48 #ifdef WIN32
    49     pDirPath = "E:\\debugLog";
    50     _snprintf(szLogPath, 1023, "%s\\p%u_%04d-%02d-%02d.log", pDirPath, uin, nYear, nMonth, nDay);
    51     // 目录不存在创建目录
    52     if (_access(pDirPath,0)!=0)
    53         if (_mkdir(pDirPath)!=0) return;
    54 #else
    55     pDirPath = "/home/game/log/debugLog";
    56     snprintf(szLogPath, 1023, "%s/p%u_%04d-%02d-%02d.log", pDirPath, uin, nYear, nMonth, nDay);
    57     if (access(pDirPath,0)!=0)
    58         if (mkdir(pDirPath, 0755)!=0) return;
    59 #endif
    60     
    61     // 追加的方式打开日志
    62     FILE* pLoger=fopen(szLogPath, "a");
    63     if (pLoger==NULL) return;
    64     
    65     // 时间    
    66     fprintf(pLoger, "[%02d:%02d:%02d] ", nHour, nMin, nSec);
    67     
    68     // 具体日志内容
    69     fprintf(pLoger, szMessage);
    70     
    71     fprintf(pLoger, "\n");        
    72     fclose(pLoger);
    73 }
    74 
    75 
    76 int main(int argc, char* argv[])
    77 {
    78     char* pFunctionName = "MySQL::OnExcute";
    79     int nLineNum = 54;
    80     char* pMsg = "select * from Name";
    81     while(nLineNum--) PrintDebugMsg(12345678, "%s %d %s",pFunctionName, nLineNum, pMsg);
    82 
    83     return 0;
    84 }

    函数mkdir(const char *pathname, mode_t mode)在解释mode_t时是将这里的mode当成8进制的去解释

    参数 mode(均按8进制去解释)有下列数种组合:

    S_ISUID   04000 文件的执行时设置用户ID(set user-id on execution)位
    S_ISGID   02000 文件的执行时设置组ID(set group-id on execution)位
    S_ISVTX   01000 文件的保存正文(粘着位sticky)位


    S_IRWXU = S_IREAD | S_IWUSRS_IXUSR   00700   // 文件所有者具有读、写、执行权限
    S_IRUSRS_IREAD)  00400   // 文件所有者具可读取权限
    S_IWUSRS_IWRITE)  00200   // 文件所有者具可写入权限
    S_IXUSRS_IEXEC)  00100   // 文件所有者具可执行权限


    S_IRWXG   00070 = S_IRGRPS_IWGRPS_IXGRP  // 用户组具有读、写、执行权限
    S_IRGRP   00040   // 用户组具可读取权限
    S_IWGRP   00020   // 用户组具可写入权限
    S_IXGRP   00010   // 用户组具可执行权限


    S_IRWXOS_IROTHS_IWOTHS_IXOTH = 00007  // 其他用户具有读、写、执行权限
    S_IROTH   00004   // 其他用户具可读取权限
    S_IWOTH   00002  // 其他用户具可写入权限
    S_IXOTH   00001  // 其他用户具可执行权限

    mode为0755时,即:S_IRWXU(文件所有者具有读、写、执行权限)、S_IRGRP+S_IXGRP(用户组具有读、执行权限)、S_IROTH+S_IXOTH(其他用户具有读、执行权限)

    mode为0766时,即:S_IRWXU(文件所有者具有读、写、执行权限)、S_IRGRP+S_IWGRP(用户组具有读、写权限)、S_IROTH+S_IWOTH(其他用户具有读、写权限)

    一般创建目录的时候应该给可执行权限,也就是755,否则是无法cd切换目录进去的

  • 相关阅读:
    DevExpress WinForms v21.1 重磅升级桑基图控件
    UI组件库Kendo UI for Angular R3 2021新版亮点 支持Bootstrap 5
    Java随笔
    oracle 排序性能 监控,Oracle 常用性能监控SQL语句
    Oracle数据库管理常用的监控脚本极大的简化运维工作
    oracle误删除数据的恢复方法
    Oracle数据库之同义词
    MVCC详解
    goldengate classic extract在什么情况需要重建以及如何重建
    Oracle OGG Kafka
  • 原文地址:https://www.cnblogs.com/kekec/p/2740075.html
Copyright © 2011-2022 走看看