① LINUX下c語言編程怎麼列印日誌
將日誌寫到文件中去,在到文件中去看日誌
例如:
int
mig_log(fmt,va_alist)
char
*fmt
;
va_dcl
{
va_list
ap
;
FILE
*fp
;
char
log_file[81]
;
struct
tm
*p_tm
;
time_t
clock
;
ap=(char
*)&va_alist
;
time(&clock)
;
p_tm=localtime(&clock)
;
sprintf(log_file,"%s/mig_%4d%.2d%.2d.log",
getenv("HOME"),
p_tm->tm_year+1900,
p_tm->tm_mon+1,
p_tm->tm_mday)
;
fp=fopen(log_file,"at")
;
if(fp==(FILE
*)0)
{
fprintf(stderr,"mig_err_log():can't
open
the
file
%s
!\n",log_file);
return
;
}
fprintf(fp,"%.2d/%.2d/%4d
%.2d:%.2d:%.2d
",
p_tm->tm_mon+1,\
p_tm->tm_mday,\
p_tm->tm_year+1900,\
p_tm->tm_hour,\
p_tm->tm_min,\
p_tm->tm_sec)
;
vfprintf(fp,fmt,ap)
;
fclose(fp)
;
}
這個就是寫日誌的函數
你這樣調用:mig_log("日誌開始[%s]->[%d]\n",__FILE__,__LINE__)
;
mig_log("日誌開始!\n")都可以的
② C語言中log函數怎麼使用
先引用
#include <math.h>
假設要計算log3(9)的值,因為C語言的logx是以e為底的相當於lnx,如果以其他數作為對數的底,必須寫成
float i
i=log(9)/log(3);
③ LINUX下C語言編程怎麼列印日誌
我們的程序一般都會產生輸出信息。但是伺服器程序一般卻不希望輸出信息到屏幕上,因為沒有人盯著你的程序執行。所以我們要把一些信息寫成日誌文件,正常情況下運行程序的人不用關心日誌里的內容,只有在出現問題的時候才會查看日誌文件里的內容以確定問題所在。
但如果我們的程序要自己生成一個文件來保存日誌卻不是好主意,因為這一方面增加了維護程序運行的人的負擔,另一方面自己維護起系統來也多有不便。
在Linux系統中有一個系統日誌,通常放在/var/log目錄下,比如文件名是syslog的,系統中的一些程序產生的日誌信息都會存放到這個文件里。日誌文件有固定的格式,比如第1列是消息產生的時間,第2列是機器名(因為日誌記錄程序支持遠程連接),第3列是標記信息(一般就是程序名稱)等。而且對應的有一些工具來對這個日誌進行維護,比如通過輪回機制保證日誌文件大小不會把磁碟空間占盡。所以我們把自己程序的信息也寫到這個系統日誌里是比較好的想法。
在GNU C語言庫提供的內容中,有介面可以用來做這件事。用下面的命令查看:
nm -D /lib/libc.so.6 | grep log
可以看到一些調用:
000b9410Tcloselog
0008b870Tgetlogin
0008b960Tgetlogin_r
000d0180T__getlogin_r_chk
000bd190Tklogctl
00027450T__open_catalog
000b9380Topenlog
0008bae0Tsetlogin
000b8b80Tsetlogmask
000b9350Tsyslog
000b9320T__syslog_chk
000b92f0Tvsyslog
000b8da0T__vsyslog_chk
這裡面的三個函數openlog, syslog, closelog是一套系統日誌寫入介面。另外那個vsyslog和syslog功能一樣,只是參數格式不同。
程序的用法示例代碼如下:
#include<syslog.h>
intmain(intargc,char**argv)
{
openlog("MyMsgMARK",LOG_CONS|LOG_PID,0);
syslog(LOG_DEBUG,
"'%s' ",
argv[0]);
closelog();
return0;
}
編譯生成可執行程序後,運行一次程序將向/var/log/syslog文件添加一行信息如下:
Feb1208:48:38localhostMyMsgMARK[7085]:'./a.out'
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'
LOG_CONS
.
LOG_NDELAY
Opentheconnectionimmediately(normally,).
LOG_NOWAIT
Don』.(TheGNUClibrarydoesnotcreatea
childprocess,.)
LOG_ODELAY
TheconverseofLOG_NDELAY;()iscalled.(Thisisthedefault,andneed
notbespecified.)
LOG_PERROR
(NotinSUSv3.)Printtostderraswell.
LOG_PID
IncludePIDwitheachmessage.
第三個參數指明記錄日誌的程序的類型。
syslog函數及參數
syslog函數用於把日誌消息發給系統程序syslogd去記錄,此函數原型是:
void syslog(int priority, const char *format, ...);
第一個參數是消息的緊急級別,第二個參數是消息的格式,之後是格式對應的參數。就是printf函數一樣使用。
如果我們的程序要使用系統日誌功能,只需要在程序啟動時使用openlog函數來連接syslogd程序,後面隨時用syslog函數寫日誌就行了。
另外,作為syslog的替代程序的新一代工具是syslog-ng,syslog-ng具有很強的網路功能,可以方便地把多台機器上的日誌保存到一台中心日誌伺服器上。
④ 計算機C語言問題 。怎麼打 log2n 注意那個2是下標
首先,log()函數是在math.h中定義的,其括弧內只有一個參數,該函數相當於我們數學中的lg();
其次,如果你想實現你的那個 log2n,你可以這樣:log(n)/log(2);
原理是我們高中就學過的一個公式:logab=lg(b)/lg(a)。(註:a為下標)。
哪裡不懂可追問:
⑤ c語言怎樣輸入對數
#include<stdio.h>
#include <math.h>
void main()
{
float x=5,y;
y=log(x);
printf("%f ",y);
}
(5)c語言列印log格式擴展閱讀:
C語言中使用對數函數的方法
log()函數:返回以e為底的對數值
頭文件:
1#include
log() 函數返回以 e 為底的對數值,其原型為:
1doublelog(doublex);
log()用來計算以e為底的 x 的對數值,然後將結果返回。設返回值為 ret,則
1x = eret
如果 x 為負數或 0,則會發生錯誤並設置 errno 值。錯誤代碼:
EDOM:參數x 為負數;
ERANGE:參數x
為零值,零的對數值無定義。
注意:使用 GCC 編譯時請加入-lm。
⑥ log3在c語言中怎樣表示
#include<stdio.h>
#include<math.h>
intmain(){
printf("%f ",log(10));//以e為底的對數函數
printf("%f ",log10(100));//以10為底的對數函數
printf("%f ",log(8)/log(2));//計算log2^8,運用換底公式
printf("%f ",exp(1));//計算自然常數e
return0;
}
(6)c語言列印log格式擴展閱讀
模擬一個log日誌的寫入
#include<stdio.h>
#include<stdarg.h>
#include<time.h>
intwrite_log(FILE*pFile,constchar*format,…)
{
va_listarg;
intdone;
va_start(arg,format);
time_ttime_log=time(NULL);
structtm*tm_log=localtime(&time_log);
fprintf(pFile,"%04d-%02d-%02d%02d:%02d:%02d",tm_log->tm_year+1900,tm_log->tm_mon+1,tm_log->tm_mday,tm_log->tm_hour,tm_log->tm_min,tm_log->tm_sec);
done=vfprintf(pFile,format,arg);
va_end(arg);
fflush(pFile);
returndone;
}
intmain()
{
FILE*pFile=fopen(「123.txt」,「a」);
write_log(pFile,"%s%d%f ","isrunning",10,55.55);
fclose(pFile);
return0;
}
⑦ C語言中log函數怎麼使用啊
1、C語言中,有兩個log函數,分別為log10和log函數,具體用法如下:
2、函數名: log10
功 能: 對數函數log,以10為底
用 法: double log10(double x);
程序示例:
#include <math.h>
#include <stdio.h>int main(void)
{
double result;
double x = 800.6872;
result = log10(x);
printf("The common log of %lf is %lf\n", x, result);
return 0;
}
3、函數名: log
功 能: 對數函數log,以e(2.71828)為底
用 法: double log(double x);
程序示例:
#include <math.h>
#include <stdio.h>int main(void)
{
double result;
double x = 800.6872;
result = log(x);
printf("The common log of %lf is %lf\n", x, result);
return 0;
}
⑧ c++log4cxx日誌的詳解
一、log4cxx命名規則
Logger由一個String類的名字識別,logger的名字是大小寫敏感的,且名字之間具有繼承的關系,子名有父名作為前綴,用點號.分隔。如:x.y是x.y.z的父親。根logger (root logger)是所有logger的祖先, 它具有如下屬性:1) 它總是存在的;2) 它不可以通過名字獲得。通過調用public static Logger Logger.getRootLogger()獲得root logger;通過調用public static Logger Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)獲得或者創建)一個named logger。後者相當於調用Logger.getLogger(clazz.getName())。在某對象中,用該對象所屬的類為參數,調用Logger.getLogger(Class clazz)以獲得logger被認為是目前 所知的最理智的命名logger的方法。
二、log4cxx Log Level級別介紹
每個logger都被分配了一個日誌級別 (log level),用來控制日誌信息的輸出。未被分配level的 logger將繼承它最近的.父logger的level。每條輸出到logger的日誌請求(logging request)也都有一個 level,如果該request的level大於等於該logger的level,則該request將被處理(稱為enabled);否則該 request將被忽略。故可得知:1、logger的level越低,表示該logger越詳細 2、logging request的 level越高,表示該logging request越優先輸出 3、如果沒有設置日誌記錄器(Logger)的級別,那麼它將 會繼承最近的祖先的級別。因此,如果在包com.foo.bar中創建一個日誌記錄器(Logger)並且沒有設置級 別,那它將會繼承在包com.foo中創建的日誌記錄器(Logger)的級別。如果在com.foo中沒有創建日誌記錄 器(Logger)的話,那麼在com.foo.bar中創建的日誌記錄器(Logger)將繼承root 日誌記錄器(Logger) 的級別,root日誌記錄器(Logger)經常被實例化而可用,它的級別為DEBUG。
Level類中預定義了五個level,它們的大小關系如下:Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF
三、log4cxx(log4j) Log layout介紹
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字元串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
四、log4cxx Log 格式化信息介紹
Log4J採用類似C語言中的printf函數的列印格式格式化日誌信息,列印參數如下:
%m 輸出代碼中指定的消息
%p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的線程名
%n 輸出一個回車換行符,Windows平台為「rn」,Unix平台為「n」
%d 輸出日誌時間點的日期或時間,默認格式為ISO8601,也可以在其後指定格式,比如:%d{yyyy MMM dd
HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 %l 輸出日誌事件的發生位置,包括類目名
、發生的線程,以及在代碼中的行數。
五、log4cxx Log appender種類介紹
Log4cXX提供的appender種類:
org.apache.log4j.ConsoleAppender 控制台
org.apache.log4j.DailyRollingFileAppender 每天產生一個日誌文件
org.apache.log4j.FileAppender 文件org.apache.log4j.RollingFileAppender 文件大小達到指定尺寸的
時候產生一個新的文件
六、log4cxx Log Filter介紹
包括選擇過濾器和設置過濾條件,可選擇的過濾器包括:LogLevelMatchFilter、LogLevelRangeFilter、和 StringMatchFilter:
1、對LogLevelMatchFilter來說,過濾條件包括LogLevelToMatch和AcceptOnMatch(true|false),只有 當log信息的LogLevel值與LogLevelToMatch相同,且AcceptOnMatch為true時才會匹配。
2、對LogLevelRangeFilter來說,過濾條件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有當log信 息的LogLevel在LogLevelMin、LogLevelMax之間同時AcceptOnMatch為true時才會匹配。
3、對StringMatchFilter來說,過濾條件包括StringToMatch和AcceptOnMatch,只有當log信息的LogLevel 值與StringToMatch對應的LogLevel值與相同,且AcceptOnMatch為true時會匹配。
七、log4cxx additivity屬性介紹
它是 子Logger 是否繼承 父Logger 的 輸出源(appender)的標志位。具體說,默認情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender里輸 出。若是additivity設為false,則子Logger只會在自己的appender里輸出,而不會在父Logger的appender里輸 出。
⑨ c語言中的log,ln,lg怎麼編寫
首先在C語言中要用到指數、對數的相關公式,需要引入math.h。另外ln是以e為底數,lg是以10為底數。
代碼如下:
#include<stdio.h>
#include<math.h>
void main()
{
double exponent, base;
exponent = 3.14;
printf("ln(%f) = %.2f ", exponent, log(exponent));//以e為底數的對數
exponent = 100;
printf("lg(%.f) = %.2f ", exponent, log10(exponent));//以10為底數的對數
base = 5, exponent = 100;
printf("log_%.f(%.f) = %.2f ", base, exponent, log(exponent)/log(base));//換底公式
return 0;
}
在求log_5(100)時需要用到「換底公式」:log_5(100) = ln(100)/ln(5)。
(9)c語言列印log格式擴展閱讀:
math.h文件中包含的函數主要分為以下幾類:
1、三角函數、反三角函數、雙曲三角函數。
2、指數、對數。
3、取整、絕對值。
4、標准化浮點數。
涉及參數類型為double類型。