该 --config-file 选项允许您以JSON格式为守护程序设置任何配置选项。此文件使用与键相同的标志名称,但允许多个条目的标志除外,它使用多个标志名称,例如, labels 用于 label 标志。
配置文件中设置的选项不得与通过flags设置的选项冲突。如果文件和标志之间的选项重复,则docker守护程序无法启动,无论掘芹握其值如何。我们这样做是为了避免静默忽略配置重新加载中引入的更改。例如,如果在配置文件中设置守护程序标签并且还通过 --label 标志设置守护程序标签,则守护程序无首知法启动。守护程序启动时将忽略文件中不存在的选项。
Linux上配置文件的默认位置是 /etc/docker/daemon.json 。该 --config-file 标志可用于指判庆定非默认位置。
修改配置文件之后需要重启docker生效
systemctl restart docker.service
参考资料:
Daemon configuration file
daemon.json的作用
<log net>
<root>
<level value= ALL />
<appender ref ref= rollingFile />
</root>
<appender name= rollingFile type= log net Appender RollingFileAppender log net >
<param name= File value= log txt />
<param name= AppendToFile value= false />
<param name= RollingStyle value= Date />
<param name= DatePattern value= yyyy MM dd />
<param name= StaticLogFileName value= true />
<layout type= log net Layout PatternLayout log net >
<param name= ConversionPattern value= %d [%t] % p %c %m%n />
<param name= Header value= header />
<param name= Footer value= footer />
</layout>
</appender>
腊卖 <appender name= consoleApp type= log net Appender ConsoleAppender log net >
<layout type= log net Layout PatternLayout log net >
<param name= ConversionPattern value= %d [%t] % p %c %m%n />
</layout>
</appender>
<logger name= Log NetTest LogTest >
<level value= DEBUG />
<appender ref ref= rollingFile />明乎
<appender ref ref= coloredConsoleApp />
<appender ref ref= SystemEvent />
</logger>
</log net>
log net配置节的XSD层次如下
<log net>
<root><level /><appender ref ref= /></root>
<appender name= type= Appender的完全限定类名 >
<param name= value= />
<layout type= log net Layout PatternLayout log net >
<param name= value= />
</layout>
</appender>
<logger>
<level value= />
<appender ref ref= />
</logger>
log net是log net配置节轮槐逗的根标记
root标记定义一个根级别的记录者 log net的记录者采用层级组织的 每一个LOGGER(ROOT也是一个LOGGER 只不过 他是祖先而已 别的方面 跟其他LOGGER一样) 都可以定义Level
level定义记录的日志级别 就是说 你要记录哪个级别以上的日志 级别由高往低依次是:
None
Fatal
ERROR
WARN
DEBUG
INFO
ALL
级别的定义要注意 如果你定义DEBUG 那么低于DEBUG级别以下的信息 将不会记入日志 啥意思呢?就是说 就算你在程序里 用()来写入一个日志信息 可是你在配置中指定level为DEBUG 由于INFO级别低于DEBUG 所以 不会被记入日志 这样的处理非常灵活
Logger还有一个配置就是appender ref了 ref是参照的意思 log net的架构非常有意思 可扩展性非常高非常值得借鉴 他分为四个要素:
logger
appender
layout
filter
logger是负责日志的记录者
appender提供记录的介质
layout负责把记入的内容格式化
filter负责把内容进行筛选
可以说 整个过程就是一个日志流水线 每个成员负责其中的一个环节
logger发出记录信息 appender接到信息 根据内部的layout配置对记录信息格式化 根据filter决定此信息是否被过滤掉 最后 将其序列化
因此 logger的appender ref就是定义说 LOGGER要找谁去将内容写入磁盘 流或其他介质 因此 十分重要吧
既然是ref引用 那肯定要定义这个被引用的appender对象了呀
每个appender都代表了一个输出介质
name属性指定其名称 type则是log net Appender命名空间的一个类的名称 意思是 指定使用哪种介质
log net支持的appender类型有十几种 最常用的有rollingFileAppender AdoNetAppender EventLogAppender FileAppender 分别把日志记入文件 系统日志和数据库
除此之外 appender内的其他参数都用param标记 以key/value形式定义于其内
这里有个小提示 每一个appender log net并没有在文档中提出他们需要哪些参数 那么 我们怎么知道呢?
原来 这些param的名称 你可以直接查对应的appender类的属性名即可 例如 使用EventLogAppender时 通过查看类的属性 我们知道其有
LogName ApplicationName属性 那么 意味着 你可以直接在这个APPENDER的param里加入以下内容:
<param name= LogName value= Application />
<param name= ApplicationName value= log netTest />
定义了appender的NAME及TYPE属性 以及使用param为其指定参数后 一个appender就建立了 你可以使用他的名字在LOGGER的<appender ref中去 引用它 那么 引用它的LOGGER在写入日志时 就是写到了APPENDER中定义的介质中去了
一个LOGGER可以引用多个APPENDER 其结果是 同一个日志 被同时记录到多个介质中去 便如 同时发邮件 写入系统日志 发送到远程主机 不过 虽然可以这样做 但是还是要小心 因为 会对性能有一定的影响 除非你需要 否则 不要乱用此功能
另外 appender中可以定义可选的layout
layout的定义非常有必要 如果你不想将来看到你的日志会感觉头晕的话 虽然log net帮你写入日志 但是 日志信息的格式却是我们使用者自行定义的layout的type参数指定使用哪个类的定义来格式化 常用的有XmlLayout SimpleLayout PatternLayout 这个当然要根据你的需要 以及你要产生的格式来选啦 如果你要输出成XML文档格式 你肯定不能用simplelayout吧
layout使用param以KEY/VALUE形式定义其参数
各个Layout类使用的参数当然不一样啦 具体的 你可以去看各个Layout类的属性
其中 PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串
以及可以指定一个Header参数 做为日志开头的字符串 Footer来指定结尾字符串
这里有一个小技巧 日志中开头和结尾总想产生回车符吧 虽然logger在写入一条日志会自动回车 可是Header和FOOTER却不会 咋办?用\n\r吗?(我从别人的BLOG上看到过)经实践 \n\r会原样定改日志 根本不会转换 其实 我们可以用XML实体呀 使用&# &# 就可以在指定位置插入一个回车换行符了
最后 像log net的文档中说的那样 如果你不想你的日志文件变得很大 使读写的性能下降的话 建议你还是分级管理日志 把粒度变小点 也就是说 除了定义ROOT外 最后 对每一个模块或每一个实体 依据用途 目的 定义各自的LOGGER配置 这样的好处是日志被分散了 日志文件增长就没那么快了 每一个LOGGER的结构跟ROOT是一模一样的 这里不再叙述了 像前面说的那样 如果你相让日志产生层级关系 你可以跟他们的NAME属性像C#中的namespace那样命名就可以了
要说明的是 LOGGER的定义是非必须的 只是一种建议罢了 Log net的配置中 除了必须定义一个ROOT和一个APPENDER外 其他的都是可选的
lishixinzhi/Article/program/net/201311/11448很简单的
配置文件 微软有抓们的一套解析函数
INI文件是Windows系统中一类比较重要的文件,通常用来存放系统或者应用程序的配置信息,以方便系统或者应用 程序在初始化时再次读入。比如Windows系统中的配置文件win.ini和system.ini,它们就主世庆要存放系统启动或用户登陆时的系统信息。这 项功能在方便了系统配置的同时,也为非法程序的自动运行提供了可乘之机。显然,这类文件的重要性应该引起我们的重视。但是对于这样的ini文件的读写 *** 作 却与普通文本文件有着种种搜纳握的不同,尤其体现在编程实现上。笔者曾经尝试用手动更改的方法在文件中加入一些项,使得自己的程序能够在初始化时自动运行,但是 却没有成功,最后还是藉由编程的方法来实现了。这里主要涉及到一些API函数,而这些函数又往往不被人们所熟知,本文的任务就是在介绍这些函数的同时,用 简单的程序作了示例,下面我们言归正传。
先来看几个往配置文件中写入信息的函数:
(1)WritePrivateProfileSection()用来在ini文件中直接向指定区域写入键和值的信息,其原型如下:
BOOL WritePrivateProfileSection(
LPCTSTR lpAppName, // 指向指定字段的字符串
LPCTSTR lpString, // 指向要写入的键与值字符串
LPCTSTR lpFileName // 指向文件名称字符串,如果不包含完整路径,则在windows目录下创建
)
用法示例:
WritePrivateProfileSection(_T(“windows”),_T(“load=c:\\winnt\\notepad.exe”),_T(“c:\\winnt\\win.ini”))
(2)WritePrivateProfileString()与上一个函数的不同点在于其将键和值分开了,原型如下:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 指向指定字段的字符茄亏串
LPCTSTR lpKeyName, // 指向指定键的字符串
LPCTSTR lpString, // 指向指定值的字符串
LPCTSTR lpFileName // 指向文件名称字符串
)
用法示例:
WritePrivateProfileString(_T(“windows”),_T(load”)_T(“c:\\winnt\\notepad.exe”),_T(“c:\\winnt\\win.ini”))
(3)WritePrivateProfileStruct()与前面两个的不同在于文件尾有校验和,原型如下:
BOOL WritePrivateProfileStruct(
LPCTSTR lpszSection, //指向指定字段的字符串
LPCTSTR lpszKey, //指向指定键的字符串
LPVOID lpStruct, //指向存放要加入的数据的缓冲区,如果为NULL,则删除键
UINT uSizeStruct, //缓冲区大小,以字节为单位
LPCTSTR szFile //以零结尾的文件名称字符串,如果为空,则向win.ini写入
)
用法示例:
WritePrivateProfileStruct(_T(“windows”),_T(“load”),pBuffer,sizeof(pBuffer),_T(“c:\\winnt\\win.ini”))
(4)还有两个函数,是专门用来向win.ini文件写入的,函数原型如下:
BOOL WriteProfileSection(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpString //指向指定值的字符串
)
BOOL WriteProfileString(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向指定键的字符串
LPCTSTR lpString //指向指定值的字符串
)
下面来看几个对应的从ini文件获取信息的API函数,上面已经说得很详细了,这里只说其中两个:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向键的字符串
LPCTSTR lpDefault, //如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量
LPTSTR lpReturnedString, //存放INI文件中值的目的缓存区
DWORD nSize, //目的缓冲区的大小,以字节为单位
LPCTSTR lpFileName //指向INI文件名称的字符串
)
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向键的字符串
INT nDefault, //如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量
LPCTSTR lpFileName //指向INI文件名称的字符串
)
程序示例1: 我们在这里建立了一个应用程序“App Name”,并且使用了一个INI文件“appname.ini”,在此INI文件中,我们写入如下内容:
[Section1]
FirstKey = It all worked out okay.
SecondKey = By golly, it works.
ThirdKey = Another test.
代码分析如下:
#include <stdio.h>
#include <windows.h>
//主函数
main()
{
//定义局部
CHAR inBuf[80]
HKEY hKey1, hKey2
DWORD dwDisposition
LONG lRetCode
// 试图创建INI文件的键值
lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT
\\CurrentVersion\\IniFileMapping\\appname.ini",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
NULL, &hKey1,
&dwDisposition)
//判断是否出错
if (lRetCode != ERROR_SUCCESS){
printf ("Error in creating appname.ini key\n")
return (0)
}
//试图设置一个节区的值
lRetCode = RegSetValueEx ( hKey1,
"Section1",
0,
REG_SZ,
"USR:App Name\\Section1",
20)
//判断是否出错
if (lRetCode != ERROR_SUCCESS) {
printf ( "Error in setting Section1 value\n")
return (0)
}
//试图创建一个应用名称键值
lRetCode = RegCreateKeyEx ( HKEY_CURRENT_USER,
"App Name",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
NULL, &hKey2,
&dwDisposition)
//判断是否出错
if (lRetCode != ERROR_SUCCESS) {
printf ("Error in creating App Name key\n")
return (0)
}
//强制系统重新读取映射区的内容到共享内存中,以便于将来对应用程序的调用可//以找到它,而不需要重新启动系统
WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" )
//向INI文件中添加一些键值
WritePrivateProfileString ("Section1", "FirstKey",
"It all worked out okay.", "appname.ini")
WritePrivateProfileString ("Section1", "SecondKey",
"By golly, it works.", "appname.ini")
WritePrivateProfileSection ("Section1", "ThirdKey = Another Test.",
"appname.ini")
//测试一下添加的正确性
GetPrivateProfileString ("Section1", "FirstKey",
"Bogus Value: Get didn't work", inBuf, 80,
"appname.ini")
printf ("%s", inBuf)
return(0)
}
程序示例2:通过修改win.ini中的字段[windows]中的键load或run,或者是为system.ini中的字段[boot]中的键 shell增加值,可以达到设置程序自动运行的目的。假设我们要自动运行notepad.exe,修改后的win.ini或system.ini文件象这 样就可以:
win.ini
[windows]
load=c:\winnt\notepad.exe
run=c:\winnt\notepad.exe
system.ini
[boot]
shell=c:\winnt\explorer.exe c:\winnt\notepad.exe
注意:system.ini文件的修改要特别注意,如果你单纯改成shell=c:\winnt\notepad.exe,则不能首先运行 explorer.exe,很明显你将看不到桌面和任务栏,呵呵,笔者在做实验时就曾因为粗心造成了这样的后果,不过不用害怕,只要你用我们下面提供的程 序,将它修改过来就可以了,默认时,系统在system.ini中的[boot]下是shell=c:\winnt\explorer.exe。很多非法 程序就是通过修改这两个文件来达到自启动的目的的。
下面这个程序可以在附书光盘中找到,名称为“AutoPlay”,使用VC++6.0写成,核心程序源代码如下:
void CAutoRunDlg::OnBrowse()
{
//只浏览exe文件
CfileDialog fileDlg(TRUE,_T("EXE"),_T("*.exe"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(_T("Executable Files (*.exe) |*.exe ||")))//显示打开文件的对话框
//当 *** 作者选择OK时,程序取得选择文件的全路径名(包括文件的路径及文件名称),并将相应的数值传输给相关的控件变量。
if(fileDlg.DoModal()==IDOK)
{
m_strFileName=fileDlg.GetPathName()
//向将变量中的数值传输给控件显示出来。
UpdateData(FALSE)
}
}
void CAutoRunDlg::OnApply()
{
//更新数据
UpdateData(TRUE)
//写入ini文件
LPCTSTR filename
filename=m_strFileName
WritePrivateProfileString(_T("windows"),_T("load"),filename,_T("c:\\winnt\\win.ini"))
}
您如果要更改system.ini,可以将WritePrivateProfileString(_T("windows"),_T("load"),filename,_T("c:\\winnt\\win.ini"))
改为 WritePrivateProfileString(_T("boot"),_T("shell"),filename,_T("c:\\winnt \\system.ini"))并且在输入文件名时输入c:\winnt\explorer.exe c:\winnt\notepad.exe。
写到这里,本文的意图基本达到,如果您可以把某些代码亲自实现,相信读者会有比较大的收获。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)