兼容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_IWUSR | S_IXUSR 00700 // 文件所有者具有读、写、执行权限
S_IRUSR(S_IREAD) 00400 // 文件所有者具可读取权限
S_IWUSR(S_IWRITE) 00200 // 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 // 文件所有者具可执行权限
S_IRWXG 00070 = S_IRGRP | S_IWGRP | S_IXGRP // 用户组具有读、写、执行权限
S_IRGRP 00040 // 用户组具可读取权限
S_IWGRP 00020 // 用户组具可写入权限
S_IXGRP 00010 // 用户组具可执行权限
S_IRWXO = S_IROTH | S_IWOTH | S_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切换目录进去的