MS SQL 日志记录管理_saga_gallon的博客-程序员秘密

技术标签: Sql server 日志  数据库  sql server  

日志记录分类

按日志文件查看器,习惯将错误日志归为SQL SERVER、 SQL SERVER 代理, Windows应用程序日志,数据库邮件等四类错误日志记录。如果还考虑维护计划、远程维护计划、作业历史记录日志信息,总共是7类日志信息文件。

clip_image002

其中Windows应用程序日志类型又分为系统日志(System)、安全日志(Security)、应用程序日志(Application), PatchLink日志等几种,我在服务器(Windows Server  2008 R2 Standard)上打开SSMS,居然发现又多了HardwareEvents, Internet Explorer、Windows PowerShell等日志文件。这些都是系统的日志文件。你不必太纠结有多少种。

clip_image004

日志记录位置

 

SQL SERVER日志记录、 SQL SERVER代理记录的位置如下所示, SQL SERVER日志记录一般存储在ERRORLOG.n(n为数字)文件里, SQL SERVER代理日志记录位于SQLAGENT.n这类的文件里。当然这跟数据库的版本也有关系:

版本

路径

SQL SERVER 2005

Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG

SQL SERVER 2008

Program Files\Microsoft SQL Server\MSSQL10.实例名\MSSQL\LOG

SQL SERVER 2008 R2

Program Files\Microsoft SQL Server\MSSQL10_50.实例名\MSSQL\LOG

    SQL SERVER 2005,默认情况下,错误日志位于 Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG\ERRORLOG 和 ERRORLOG.n 文件中。其中MSSQL.n的区分为:

        MSSQL.1:SQLSERVER

        MSSQL.2:SSAS

        MSSQL.3:SQLExpress

        MSSQL.4:SSRS

所以,一般情况下,你只需要关注MSSSQL.1目录下的日志文件

clip_image006

那么,数据库邮件日志记录位于哪里呢?作业历史记录日志信息、Windows应用程序日志又位于哪里呢?是不是从没考虑过这些?

数据库邮件日志记录信息可以从视图msdb.dbo.sysmail_event_log查询得到,实质保存在[dbo].[sysmail_log]表里面。

sysmail_event_log
  1.  SELECT log_id ,
  2.         CASE event_type
  3.           WHEN 0 THEN 'success'
  4.           WHEN 1 THEN 'information'
  5.           WHEN 2 THEN 'warning'
  6.           ELSE 'error'
  7.         END AS event_type ,
  8.         log_date ,
  9.         description ,
  10.         process_id ,
  11.         sl.mailitem_id ,
  12.         account_id ,
  13.         sl.last_mod_date ,
  14.         sl.last_mod_user
  15.     FROM[dbo].[sysmail_log] sl
  16. WHERE   ( ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1 )
  17.         OR( EXISTS( SELECT    mailitem_id
  18.                       FROM      [dbo].[sysmail_allitems] ai
  19.                       WHERE     sl.mailitem_id = ai.mailitem_id ) )

作业历史记录日志信息都保存在msdb.dbo.sysjobhistory的表里面,其中run_status字段代表作业执行状态

0 = 失败

1 = 成功

2 = 重试

3 = 已取消

4= 正在进行

所有Windows应用程序日志其实都位于同一位置%SystemRoot%\System32\Winevt\Log。像Application日志文件位于%SystemRoot%\System32\Winevt\Logs\Application.evtx,如下所示,

clip_image008

查看日志记录

查看日志记录可以确保进程(例如,备份和还原操作、批处理命令或其他脚本和进程)成功完成。此功能可用于帮助检测任何当前或潜在的问题领域,包括自动恢复消息(尤其是在 SQL Server 实例已停止并重新启动时)、内核消息或其他服务器级错误消息。

方式1: 查看错误日志文件

对SQL SERVER、SQL SERVER AGENT日志记录信息,你可以直接去log目录下找到ERRORLOG、SQLAGENT日志文件,直接打开查看;而像Windows应用程序日志记录,去到%SystemRoot%\System32\Winevt\Log目录,找到对应的日志文件,直接打开查看。

 

方式2:通过SSMS来查看日志记录

查看与常规 SQL Server 活动相关的日志

  1. 在对象资源管理器中,依次展开“管理”“SQL Server 日志”,再双击“当前<日期/时间>,将显示 SQL Server“SQL 代理”“Windows 事件”日志。

查看与作业相关的日志

  1. 在对象资源管理器中,展开“SQL Server 代理”,右键单击“作业”,再单击“查看历史记录”,此时将显示“作业历史记录”“SQL 代理”日志。

查看与维护计划相关的日志

  1. 在对象资源管理器中,展开“管理”,右键单击“维护计划”,再单击“查看历史记录”,此时将显示“维护计划”“作业历史记录”“SQL 代理”日志。

 

方式3:用脚本查看

3.1 对于SQL SERVER日志文件,可以通过下面脚本查看:

   --查看日志文件的存档号

    EXEC master.dbo.sp_enumerrorlogs

   用这个命令可以查看日志文件的大小,这个非常有用,你可以把大小异常的文件给排查出来。

 

   --根据存档号查看该档日志内容

   EXEC master.dbo.xp_readerrorlog 1

   --根据job_id查看SQL SERVER日志记录

  SELECT * FROM  msdb.dbo.sysjobhistory WHERE job_id='36E9232B-CD5B-4646-9BED-B8242090FFF9'

 

3.2 对于作业历史记录日志信息,你既可以通过下面存储过程查看,也可以直接查询对应的表。

例如,我要查看作业“ServerDiskCapacityCheck”的历史记录

Code Snippet
  1.  
  2.  
  3. USE msdb ;
  4.  
  5. GO
  6.  
  7. EXEC dbo.sp_help_jobhistory
  8.  
  9. @job_name = N'ServerDiskCapacityCheck' ;
  10.  
  11. GO
  12.  
  13. »ò
  14.  
  15.   SELECT      j.name AS  [JOB_NAME] ,
  16.  
  17.             h.step_id AS  [Step] ,  
  18.  
  19.             h.step_name AS  [STEP_NAM] ,  
  20.  
  21.             h.MESSAGE AS  [Message] ,  
  22.  
  23.             [Status]    = CASE WHEN h.run_status = 0 THEN 'Failed'  
  24.  
  25.             WHEN h.run_status = 1 THEN 'Succeeded'  
  26.  
  27.             WHEN h.run_status = 2 THEN 'Retry'  
  28.  
  29.             WHEN h.run_status = 3 THEN 'Canceled'  
  30.  
  31.             END,  
  32.  
  33.             h.run_date AS  [RunDate] ,  
  34.  
  35.             h.run_time AS  [RunTime] ,  
  36.  
  37.             h.run_duration  AS  [RunDuration]
  38.  
  39.   FROM        sysjobs j
  40.  
  41.     INNER JOIN  sysjobhistory h ON h.job_id = j.job_id
  42.  
  43. WHERE h.run_date>=CONVERT(CHAR(8),GETDATE()-1,112) AND h.run_status<>1   
  44.  
  45.   /* WHERE    j.name = 'Job_Name' */
  46.  
  47.     ORDER BYh.run_date, h.run_time

 

3.3数据库邮件记录查看

SELECT * FROM  msdb.dbo.sysmail_event_log;

 

日志记录管理

 

设置最大错误日志文件数

    1:在对象资源管理器中,连接到 SQL Server 数据库引擎实例,再展开该实例。

    2:在”管理“选项,选择”SQL SERVER日志”,单击右键选择配置。 顺便说一下,很多网上资料说,SQL SERVER默认保留前6个日志文件,但是我查看了SQL SERVER 2005和SQL SERVER 2008,都是默认保留30个,有时候需要自己去验证、实验,不要人人亦云。估计这个说法是SQL SERVER 2000时的配置了。

clip_image010

当然,你也可以用命令设置:

USE [master]
 
GO
 
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 10
 
GO
 

设置错误日志文件存放目录

1:在对象资源管理器中,连接到 SQL Server 数据库引擎实例,再展开该实例。

2:展开“SQL SERVER”代理。

3:右键单击”错误日志“,然后选择配置选项,如下所示:

clip_image012

4:在”错误日志文件“选项中,输入新的路径和文件名,或使用浏览(...)按钮进行查找。重新启动SQL SERVER代理服务后,SQL SERVER代理才写入到新的日志文件。

clip_image014

 

 

设置作业历史记录日志

  1. 对象资源管理器中,连接到 SQL Server 数据库引擎 实例,再展开该实例。
  2. 右键单击“SQL Server 代理”,再单击“属性”
  3. “SQL Server 代理属性”对话框中,选择“历史记录”页。
  4. 从下列选项中选择:
    • 选中“限制作业历史记录日志的大小”,然后键入作业历史记录日志的最大行数和每个作业的最大行数。
    • 选中“自动删除代理历史记录”,然后指定时间段。这样,早于此时间段的历史记录将从日志中清除。
    • clip_image016

为什么错误日志文件暴增?

这里我说的不仅仅指某个错误日志记录文件暴增,也指目录Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\LOG所占空间暴增,如果你平时都不关注这些错误日志,也从不维护错误日志记录文件,那么很有可能它所占的空间非常大,大到让你吃惊的地步。几十G的我也见过,那么具体原因可能有以下种(如果大家还碰到过其它情况,欢迎补充):

 

1:SQL 内部错误的时候会产生非常多的DUMP文件,如下所示

clip_image018

2:高可用的数据库服务器可能很少停机,而你又没有定期清理、清空这些错误日志信息,那么ERRORLOG.n/SQLAGENT.n文件增长会非常大。这样对于DBA使用错误日志查找信息就会比较困难,而且日志大了加载、写入以后性能也会受到影响。

3:其实还有一个情况,如果你数据库IP地址曝露在外网时,会遭到大量尝试登录sa的攻击,也会产生大量的审核失败日志信息。

4:就是一些SQL SERVER PROFILE文件没有删除,当然,这个本质跟日志文件暴增没啥关系,但是跟LOG文件夹的大小有些关系。

如何清理错误日志:

对于SQL SERVER日志、SQL SERVER AGENT日志记录,微软提供了一个存储过程sp_cycle_errorlog可以实现日志的循环。 这个存储过程的作用是关闭当前的错误日志文件,并循环错误日志扩展编号(就像重新启动服务器)。每次启动SQL Server 时,都会将当前错误日志重命名为errorlog.1errorlog.1 变为errorlog.2errorlog.2 变为errorlog.3,依次类推。最后一个errorlog.n将会被删除。sp_cycle_errorlog 可使您循环访问错误日志文件,而不必停止和启动服务器。

另外:日志过大说明你没有截断错误日志,错误日志是可以截断的,进入你的数据库输入DBCC ERRORLOG

每执行一次,当前的错误日志退出,让后建立新的错误日志,你只能删除 ERRORLOGn的错误日志没有号码的是正在使用的日志,删除会报错,如果它比较大,就DBCC ERRORLOG,而后他会变成ERRORLOG+编号,你就可以删除了,另外建议你把这些ERRORLOG 放到其他盘符,比较好管理。

对于 Windows应用程序日志,一般都有默认的大小设置,以及按需要覆盖。这些配置一般也是最优的配置。所以这块除非你有特殊需求,否则不用你操心。

 

 

clip_image020

对于邮件日志记录,存储过程sysmail_delete_log_sp提供从数据库邮件日志中删除事件。删除日志中的所有事件或删除符合某一日期或类型条件的那些事件

sysmail_delete_log_sp [ [ @logged_before = ] 'logged_before' ]

[, [ @event_type = ] 'event_type' ]

 

 删除参数指定的所有 SQL Server 代理作业步骤日志。使用此存储过程可维护 msdb 数据库中的 sysjobstepslogs 表。

sp_delete_jobsteplog { [ @job_id = ] 'job_id' | [ @job_name = ] 'job_name' }

[ , [ @step_id = ] step_id | [ @step_name = ] 'step_name' ]

[ , [ @older_than = ] 'date' ]

[ , [ @larger_than = ] 'size_in_bytes' ]

 

删除作业的历史记录

删除特定作业YourSQLDba_LogBackups的历史记录。

USE msdb ;

GO

EXEC dbo.sp_purge_jobhistory

@job_name = N'YourSQLDba_LogBackups' ;

GO

以下示例将不带参数执行此过程以删除所有的历史记录。


USE msdb ;

GO

EXEC dbo.sp_purge_jobhistory ;

GO

 

删除参数指定的所有 SQL Server 代理作业步骤日志。使用此存储过程可维护 msdb 数据库中的 sysjobstepslogs 表。如果你想好好维护日志记录,那么你可以整合上面的思想方法到一个存储过程,然后配置一个作业来定期清理日志记录,接下来我们看看YourSQLDba的方法吧

Code Snippet
  1. USE [YourSQLDba]
  2. GO
  3.  
  4. /****** Object:  StoredProcedure [yMaint].[LogCleanup]    Script Date: 05/28/2013 18:36:21 ******/
  5. SET ANSI_NULLS ON
  6. GO
  7.  
  8. SET QUOTED_IDENTIFIER ON
  9. GO
  10.  
  11. -----------------------------------------------------------------------------
  12. -- yMaint.LogCleanup (for entries older than 30 days)
  13. -- Mail logs
  14. -- Backup history logs
  15. -- Job history
  16. -- Cycle SQL Server error log
  17. -----------------------------------------------------------------------------
  18. create proc [yMaint].[LogCleanup]
  19.   @jobNo Int
  20. as
  21. Begin
  22.   declare @d nvarchar(8)
  23.   declare @lockResult int
  24.   declare @sql nvarchar(max)
  25.  
  26.   Begin try
  27.  
  28.   exec yMaint.LockMaintDb@jobNo=@jobNo, @lockType='C', @DbName = 'LogCleanUpStep', @Result = @lockResultoutput
  29.   If @lockResult > 0
  30.     Return;
  31.  
  32.   Set @sql = 'Exec msdb.dbo.sysmail_delete_log_sp @logged_before = "<d>";'
  33.   Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  34.   Set @sql = replace(@sql, '"', '''')
  35.   Exec yExecNLog.LogAndOrExec
  36.     @context = 'yMaint.LogCleanup'
  37.   , @info = 'Cleanup log entries older than 30 days, begins with mail'
  38.   , @sql = @sql
  39.   , @JobNo = @JobNo
  40.   
  41.   Set @sql = 'EXECUTE msdb.dbo.sysmail_delete_mailitems_sp  @sent_before = "<d>";'
  42.   Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  43.   Set @sql = replace(@sql, '"', '''')
  44.   Exec yExecNLog.LogAndOrExec
  45.     @context = 'yMaint.LogCleanup'
  46.   , @info = 'Cleanup log entries older than 30 days, for mailitems'
  47.   , @sql = @sql
  48.   , @JobNo = @JobNo
  49.  
  50.   -- clean backup history
  51.   Set @sql = 'exec  Msdb.dbo.sp_delete_backuphistory   @oldest_date = "<d>" '
  52.   Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  53.   Set @sql = replace(@sql, '"', '''')
  54.   Exec yExecNLog.LogAndOrExec
  55.     @context = 'yMaint.LogCleanup'
  56.   , @info = 'Cleanup log entries older than 30 days, for backup history'
  57.   , @sql = @sql
  58.   , @JobNo = @JobNo
  59.   
  60.   -- clean sql agent job history
  61.   Set @sql = 'EXECUTE  Msdb.dbo.sp_purge_jobhistory  @oldest_date = "<d>"'
  62.   Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  63.   Set @sql = replace(@sql, '"', '''')
  64.   Exec yExecNLog.LogAndOrExec
  65.     @context = 'yMaint.LogCleanup'
  66.   , @info = 'Cleanup log entries older than 30 days, for job history'
  67.   , @sql = @sql
  68.   , @JobNo = @JobNo
  69.   
  70.   -- clean job maintenance job history (SQL Server own maintenance)
  71.   Set @sql = 'EXECUTE  Msdb.dbo.sp_maintplan_delete_log null,null,"<d>"'
  72.   Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  73.   Set @sql = replace(@sql, '"', '''')
  74.   Exec yExecNLog.LogAndOrExec
  75.     @context = 'yMaint.LogCleanup'
  76.   , @info = 'Cleanup log entries older than 30 days, for SQL Server job maintenace plans'
  77.   , @sql = @sql
  78.   , @JobNo = @JobNo
  79.   
  80.   -- archive current log, and start a new one
  81.   Set @sql = 'Execute sp_cycle_errorlog'
  82.   Set @sql = replace(@sql, '<d>', convert(nvarchar(8), dateadd(dd, -30, getdate()), 112))
  83.   Set @sql = replace(@sql, '"', '''')
  84.   Exec yExecNLog.LogAndOrExec
  85.     @context = 'yMaint.LogCleanup'
  86.   , @info = 'Recycle Sql Server error log, start a new one'
  87.   , @sql = @sql
  88.   , @JobNo = @JobNo
  89.  
  90.   Delete H
  91.   From
  92.     (
  93.     Select distinct JobNo --
  94.     From  Maint.JobHistory
  95.     Where JobStart < dateadd(dd, -30, getdate())
  96.     ) as T
  97.     join
  98.     Maint.JobHistory H  
  99.     On H.JobNo = T.JobNo
  100.  
  101.   End try
  102.   Begin catch
  103.     exec yMaint.UnLockMaintDb@jobNo=@jobNo, @DbName = 'LogCleanUpStep'
  104.     Exec yExecNLog.LogAndOrExec
  105.         @context = 'yMaint.LogCleanup'
  106.       , @Info = 'Error caught in proc'  
  107.       , @err = '?'
  108.       , @JobNo = @JobNo
  109.   End Catch
  110.  
  111.   exec yMaint.UnLockMaintDb@jobNo=@jobNo, @DbName = 'LogCleanUpStep'
  112.  
  113. End -- yMaint.LogCleanup
  114.  
  115. GO

参考资料:

http://msdn.microsoft.com/zh-cn/library/ms187885(v=sql.105).aspx

http://www.jb51.net/article/26988.htm

http://groundsel.itpub.net/post/1284/494264

http://www.canway.net/Lists/CanwayOriginalArticels/DispForm.aspx?ID=291

http://technet.microsoft.com/zh-cn/library/ms191202(v=SQL.105).aspx

http://support.microsoft.com/kb/157804/zh-cn

http://support.microsoft.com/kb/115519/zh-cn

http://blog.csdn.net/smithliu328/article/details/7843724

http://blog.csdn.net/claro/article/details/5660524

http://www.cnblogs.com/lyhabc/archive/2013/02/12/2910623.html

转载于http://www.cnblogs.com/kerrycode/archive/2013/05/28/3104214.html               潇湘隐者

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/saga_gallon/article/details/54089882

智能推荐

计算机网络体系结构与数据通信(补充):ip地址、域名和url_拟古的新打油诗的博客-程序员秘密

文章目录1、ip地址1.1、ip地址分配1.2、ipv41.3、ip协议1.4、子网1.5、ipv62、域名3、URL1、ip地址internet protocol address,互联网协议地址1.1、ip地址分配ip地址通常由网络管理员手动分配或系统自动分配。静态IP地址:即固定ip,需要手工在终端上设置IP地址、掩码、网关、DNS等信息。注意所有终端的IP地址不能重复,如果重复就会出现IP地址冲突导致终端无法上网。所以就需要自己手中有一张IP地址分配表,需要手动维护。动态IP地址:通过DH

maven常用命令行及解释_phantomes的博客-程序员秘密_maven启动命令

最近突然在maven的安装目录下,找到了以前的一些笔记,里面有一些是关于maven的命令的,这里就写下来,方便以后查看或者添加,算作笔记吧。 maven命令:一、安装maven验证版本命令:mvn -v 二、新建maven项目命令:1.mvn archetype:create -DgroupId=org.apache.maven\-Darti

java水印图片_JAVA实用案例之图片水印开发_日月龙腾的博客-程序员秘密

写在最前面上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考。Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上搭建的,基于Spring+SpringMVC。如果有错误还请大家指正。简单介绍水印开发是web开发中一种比较常见的功能,实现的代码很简单,具体的实现步骤我也会以代码为基础详细讲述。其实以我个人的理解,我把...

opnet 基本核心函数 ---4 包函数集 2_happylife1527的博客-程序员秘密

3)目的该核心函数提供了对包中字段赋值的机制。该函数只能对格式化包的字段赋值,否则将出错。对于格式化包,只需指定字段的值,而字段的类型和大小可从包格式中自动获取。4)错误Program Abort:分段错误(由无效包指针或fd_name参数引起)。Program Abort:包指针为空。Program Abort:包指针指向已销毁包。Program Abort:包指针指向未

FreeRtos 任务优先级和中断优先级_位文杰TOP的博客-程序员秘密_freertos的任务优先级

首先打出这个标题是为了便于搜索在这里赘述一下 这两者没有关系 只需要明白的是中断优先级高于任务的优先级 在单片机运行的过程中 中断来了就执行中断服务程序。在free-rtos中 任务优先级设置的数值越大 任务的优先级越高Unix任务优先: 进程优先级数值越小,进程优先级越高。在RT-Thread 任务优先级设置的数值越小 任务的优先级越高首先贴上Freertos的配置 任务优先级配置 1. FreeRTOS中任务的最高优先级是通过FreeRTOSConfig.h中的con

亲戚(relation)_小李_学员的博客-程序员秘密

题目描述或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及。在这种情况下,最好的帮手就是计算机。为了将问题简化,你将得到一些亲戚关系的信息,如Marry和Tom是亲戚,Tom和Ben是亲戚,等等。从这些信息中,你可以推出Marry和Ben是亲戚。请写一个程序,对于我们的关于亲戚关系的提问,以最快的速度给出答案。输入输

随便推点

Java使用青云客智能聊天接口做一个小助手_华谨舞的博客-程序员秘密

青云客:http://api.qingyunke.com/也可以使用其他公司的API,比如腾讯、阿里等。

c语言while训练,C语言day04-08while练习3_weixin_39631689的博客-程序员秘密

pragma mark while练习3pragma mark 概念/*** C语言的函数库#include // 随机数函数库 语音功能arc4random_uniform(20); 随机数函数库system("say 我的WeChat is LYH28588"); 让计算机拥有语音播放功能*/pragma mark 代码#include #include /...

linux centos5.7字体安装,Linux CentOS 7 安装字体库 & 中文字体_weixin_39667652的博客-程序员秘密

报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效:如上图可以看出,不仅没有中文字体,连字体库都没有,那么接下来就记录一下在Linux CentOS 7中如何安装字体库以及中文字体。安装字体库在CentOS 4.x开始用fontconfig来安装字体库,所以输入以下命令即可:yum -y insta...

Mac 根目录下无法挂载文件解决方案_geekidentity的博客-程序员秘密

欢迎持续关注: http://blog.geekidentity.com/2020/10/14/linux/mac_mount_file_in_root/由于Mac默认有系统文件保护,所以无法在 / 下创建文件 Read-only file system 。百度出来的文章是关闭系统文件保护,但其实并不是官方方案,官方建议使用 synthetic.confman synthetic.conf看到这个文件说明SYNOPSIS synthetic.conf -- synthetic symbol

文件的内核结构file和dup实现重定向_weixin_33752045的博客-程序员秘密

一、打开文件内核数据结构1、一个进程打开两个文件文件状态标志:读、写、追加、同步、非阻塞等2、一个进程两次打开同一文件3、两个进程打开同一文件示例程序:  C++ Code 12345678910111213141516171819202122232425262728293031323...

html-中文字体在CSS中的显示(Unicode编码)_liujiajie1990的博客-程序员秘密

在CSS中使用中文字体通常直接设置字体名称,比如设置字体为宋体:font-family:’宋体’。但因此产生的一个问题是,如果CSS编码有误,会导致页面加载后CSS中的中文字体乱码直接使用中文字体,有时候在ie6下会出现样式丢失问题。而使用英文代替中文如:“font-family:SimSun”也不推荐,Firefox的部分版本与Opera在处理SimSun时会有问题。所以推荐使用