① 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类型。