PHP实现日志处理类库
继上篇文章【微信开发之微电商网站】技术笔记之一,昨日做了日志处理的功能。
对于现在的应用程序来说,日志的重要性是不言而喻的。很难想象没有任何日志记录功能的应用程序运行在生产环境中。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。在生产环境中,日志是查找问题来源的重要依据。应用程序运行时的产生的各种信息,都应该通过日志类库来进行记录。
废话不多说了,附上日志类库的源代码:
<span 1</span> <span /*</span><span * </span><span 2</span> <span * 日志处理类 </span><span 3</span> <span * </span><span 4</span> <span * @since alpha 0.0.1 </span><span 5</span> <span * @date 2014.03.04 </span><span 6</span> <span * @author genialx </span><span 7</span> <span * </span><span 8</span> <span */</span> <span 9</span> <span 10</span> <span class</span> <span Log</span><span { </span><span 11</span> <span 12</span> <span //</span><span 单例模式</span> <span 13</span> <span private</span> <span static</span> <span $instance</span> = <span NULL</span><span ; </span><span 14</span> <span //</span><span 文件句柄</span> <span 15</span> <span private</span> <span static</span> <span $handle</span> = <span NULL</span><span ; </span><span 16</span> <span //</span><span 日志开关</span> <span 17</span> <span private</span> <span $log_switch</span> = <span NULL</span><span ; </span><span 18</span> <span //</span><span 日志相对目录</span> <span 19</span> <span private</span> <span $log_file_path</span> = <span NULL</span><span ; </span><span 20</span> <span //</span><span 日志文件最大长度,超出长度重新建立文件</span> <span 21</span> <span private</span> <span $log_max_len</span> = <span NULL</span><span ; </span><span 22</span> <span //</span><span 日志文件前缀,入 log_0</span> <span 23</span> <span private</span> <span $log_file_pre</span> = 'log_'<span ; </span><span 24</span> <span 25</span> <span 26</span> <span /*</span><span * </span><span 27</span> <span * 构造函数 </span><span 28</span> <span * </span><span 29</span> <span * @since alpha 0.0.1 </span><span 30</span> <span * @date 2014.02.04 </span><span 31</span> <span * @author genialx </span><span 32</span> <span */</span> <span 33</span> <span protected</span> <span function</span> __construct(){<span //</span><span 注意:以下是配置文件中的常量,请读者自行更改</span> <span 34</span> <span 35</span> <span $this</span>->log_file_path =<span LOG_FILE_PATH; </span><span 36</span> <span 37</span> <span $this</span>->log_switch =<span LOG_SWITCH; </span><span 38</span> <span 39</span> <span $this</span>->log_max_len =<span LOG_MAX_LEN; </span><span 40</span> <span 41</span> <span } </span><span 42</span> <span 43</span> <span /*</span><span * </span><span 44</span> <span * 单利模式 </span><span 45</span> <span * </span><span 46</span> <span * @since alpha 0.0.1 </span><span 47</span> <span * @date 2014.02.04 </span><span 48</span> <span * @author genialx </span><span 49</span> <span */</span> <span 50</span> <span public</span> <span static</span> <span function</span><span get_instance(){ </span><span 51</span> <span if</span>(!self::<span $instance</span><span instanceof self){ </span><span 52</span> self::<span $instance</span> = <span new</span><span self; </span><span 53</span> <span } </span><span 54</span> <span return</span> self::<span $instance</span><span ; </span><span 55</span> <span } </span><span 56</span> <span 57</span> <span /*</span><span * </span><span 58</span> <span * </span><span 59</span> <span * 日志记录 </span><span 60</span> <span * </span><span 61</span> <span * @param int $type 0 -> 记录(THING LOG) / 1 -> 错误(ERROR LOG) </span><span 62</span> <span * @param string $desc </span><span 63</span> <span * @param string $time </span><span 64</span> <span * </span><span 65</span> <span * @since alpha 0.0.1 </span><span 66</span> <span * @date 2014.02.04 </span><span 67</span> <span * @author genialx </span><span 68</span> <span * </span><span 69</span> <span */</span> <span 70</span> <span public</span> <span function</span> <span log</span>(<span $type</span>,<span $desc</span>,<span $time</span><span ){ </span><span 71</span> <span if</span>(<span $this</span>-><span log_switch){ </span><span 72</span> <span 73</span> <span if</span>(self::<span $handle</span> == <span NULL</span><span ){ </span><span 74</span> <span $filename</span> = <span $this</span>->log_file_pre . <span $this</span>-><span get_max_log_file_suf(); </span><span 75</span> self::<span $handle</span> = <span fopen</span>(<span $this</span>->log_file_path . <span $filename</span>, 'a'<span ); </span><span 76</span> <span } </span><span 77</span> <span switch</span>(<span $type</span><span ){ </span><span 78</span> <span case</span> 0: <span 79</span> <span fwrite</span>(self::<span $handle</span>, 'THING LOG:' . ' ' . <span $desc</span> . ' ' . <span $time</span> . <span chr</span>(13<span )); </span><span 80</span> <span break</span><span ; </span><span 81</span> <span case</span> 1: <span 82</span> <span fwrite</span>(self::<span $handle</span>, 'ERROR LOG:' . ' ' . <span $desc</span> . ' ' . <span $time</span> . <span chr</span>(13<span )); </span><span 83</span> <span break</span><span ; </span><span 84</span> <span default</span>: <span 85</span> <span fwrite</span>(self::<span $handle</span>, 'THING LOG:' . ' ' . <span $desc</span> . ' ' . <span $time</span> . <span chr</span>(13<span )); </span><span 86</span> <span break</span><span ; </span><span 87</span> <span } </span><span 88</span> <span 89</span> <span } </span><span 90</span> <span } </span><span 91</span> <span 92</span> <span /*</span><span * </span><span 93</span> <span * 获取当前日志的最新文档的后缀 </span><span 94</span> <span * </span><span 95</span> <span * @since alpha 0.0.1 </span><span 96</span> <span * @date 2014.02.04 </span><span 97</span> <span * @author genialx </span><span 98</span> <span */</span> <span 99</span> <span private</span> <span function</span><span get_max_log_file_suf(){ </span><span 100</span> <span $log_file_suf</span> = <span null</span><span ; </span><span 101</span> <span if</span>(<span is_dir</span>(<span $this</span>-><span log_file_path)){ </span><span 102</span> <span if</span>(<span $dh</span> = <span opendir</span>(<span $this</span>-><span log_file_path)){ </span><span 103</span> <span while</span>((<span $file</span> = <span readdir</span>(<span $dh</span>)) != <span FALSE</span><span ){ </span><span 104</span> <span if</span>(<span $file</span> != '.' && <span $file</span> != '..'<span ){ </span><span 105</span> <span if</span>(<span filetype</span>( <span $this</span>->log_file_path . <span $file</span>) == 'file'<span ){ </span><span 106</span> <span $rs</span> = <span split</span>('_', <span $file</span><span ); </span><span 107</span> <span if</span>(<span $log_file_suf</span> < <span $rs</span>[1<span ]){ </span><span 108</span> <span $log_file_suf</span> = <span $rs</span>[1<span ]; </span><span 109</span> <span } </span><span 110</span> <span } </span><span 111</span> <span } </span><span 112</span> <span } </span><span 113</span> <span 114</span> <span if</span>(<span $log_file_suf</span> == <span NULL</span><span ){ </span><span 115</span> <span $log_file_suf</span> = 0<span ; </span><span 116</span> <span } </span><span 117</span> <span //</span><span 截断文件</span> <span 118</span> <span if</span>( <span file_exists</span>(<span $this</span>->log_file_path . <span $this</span>->log_file_pre . <span $log_file_suf</span>) && <span filesize</span>(<span $this</span>->log_file_path . <span $this</span>->log_file_pre . <span $log_file_suf</span>) >= <span $this</span>-><span log_max_len){ </span><span 119</span> <span $log_file_suf</span> = <span intval</span>(<span $log_file_suf</span>) + 1<span ; </span><span 120</span> <span } </span><span 121</span> <span 122</span> <span return</span> <span $log_file_suf</span><span ; </span><span 123</span> <span } </span><span 124</span> <span } </span><span 125</span> <span 126</span> <span return</span> 0<span ; </span><span 127</span> <span 128</span> <span } </span><span 129</span> <span 130</span> <span /*</span><span * </span><span 131</span> <span * 关闭文件句柄 </span><span 132</span> <span * </span><span 133</span> <span * @since alpha 0.0.1 </span><span 134</span> <span * @date 2014.02.04 </span><span 135</span> <span * @author genialx </span><span 136</span> <span */</span> <span 137</span> <span public</span> <span function</span><span close(){ </span><span 138</span> <span fclose</span>(self::<span $handle</span><span ); </span><span 139</span> <span } </span><span 140</span> }
功能说明:
该日志类利用单例模式,节省资源。自行判断文件大小,超出指定大小则按序自行创建文件。如:文件log_0大于指定大小,则重新创建log_1文件(注意:创建文件是安装文件名后缀的数字的,请勿随意更改日志文件名)。
有待优化:没有指定文件的最大个数,所以定期要手动删除过多的日志文件。
调用示例:
<span 1</span> <span //</span><span LOG</span> <span 2</span> <span $L</span> = <span Log</span>::<span get_instance(); </span><span 3</span> <span //</span><span 第一个参数 int 0代表事件记录(THING LOG:),1代表错误记录(ERROR LOG:) </span><span 4</span> <span //第二个参数 string 描述文字 </span><span 5</span> <span //第三个参数 string 时间</span> <span 6</span> <span $L</span>-><span log</span>(1,'日志描述', <span date</span>('Y-n-j H:m:s'<span )); </span><span 7</span> <span $L</span>->close();
感谢您的查阅!
文章来源:http://www.ihuxu.com/p/223.html
微信公众号(每日分享有价值的互联网资讯):胡旭个人博客
新浪微博:@身边的互联网
编程讨论群:235173087
QQ:2252065614

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Vue.js와 ASP.NET의 결합은 웹 애플리케이션의 성능 최적화와 확장을 위한 팁과 제안을 제공합니다. 웹 애플리케이션의 급속한 발전으로 인해 성능 최적화는 개발자에게 필수적이고 중요한 작업이 되었습니다. 인기 있는 프런트 엔드 프레임워크인 Vue.js를 ASP.NET과 결합하면 더 나은 성능 최적화 및 확장을 달성하는 데 도움이 될 수 있습니다. 이 문서에서는 몇 가지 팁과 제안 사항을 소개하고 몇 가지 코드 예제를 제공합니다. 1. HTTP 요청 감소 HTTP 요청 수는 웹 애플리케이션의 로딩 속도에 직접적인 영향을 미칩니다. 통과하다

번역기 | 검토자: Chen Jun | Chonglou 1990년대에 사람들이 소프트웨어 프로그래밍을 언급할 때 이는 일반적으로 편집기를 선택하고 코드를 CVS 또는 SVN 코드 베이스로 확인한 다음 코드를 실행 파일로 컴파일하는 것을 의미했습니다. Eclipse 및 Visual Studio와 같은 해당 통합 개발 환경(IDE)은 프로그래밍, 개발, 문서화, 구성, 테스트, 배포 및 기타 단계를 완전한 소프트웨어 개발 수명 주기(SDLC)에 통합하여 개발자의 작업 효율성을 향상시킬 수 있습니다. 최근 몇 년 동안 널리 사용되는 클라우드 컴퓨팅 및 DevSecOps 자동화 도구는 개발자의 포괄적인 역량을 향상시켜 더 많은 기업이 소프트웨어 애플리케이션을 보다 쉽게 개발, 배포 및 유지 관리할 수 있게 되었습니다. 오늘날 생성적 AI는 차세대 개발입니다.

ASP.NET 프로그램에서 MySQL 연결 풀을 올바르게 사용하고 최적화하는 방법은 무엇입니까? 소개: MySQL은 고성능, 안정성 및 사용 용이성을 특징으로 널리 사용되는 데이터베이스 관리 시스템입니다. ASP.NET 개발에서는 데이터 저장을 위해 MySQL 데이터베이스를 사용하는 것이 일반적인 요구 사항입니다. 데이터베이스 연결의 효율성과 성능을 향상시키기 위해서는 MySQL 연결 풀을 올바르게 사용하고 최적화해야 합니다. 이 기사에서는 ASP.NET 프로그램에서 MySQL 연결 풀을 올바르게 사용하고 최적화하는 방법을 소개합니다.

ASP.NET 프로그램에서 MySQL에 다시 연결하는 방법은 무엇입니까? ASP.NET 개발에서는 MySQL 데이터베이스를 사용하는 것이 매우 일반적입니다. 그러나 네트워크나 데이터베이스 서버 문제로 인해 데이터베이스 연결이 중단되거나 타임아웃되는 경우가 있습니다. 이 경우, 프로그램의 안정성과 신뢰성을 보장하기 위해 연결이 끊어진 후 연결을 다시 설정해야 합니다. 이 기사에서는 ASP.NET 프로그램에서 MySQL 연결을 다시 연결하는 방법을 소개합니다. 필요한 네임스페이스를 먼저 참조하려면 코드 파일의 헤드에서 참조하세요.

Vue.js와 ASP.NET의 결합을 통해 엔터프라이즈급 애플리케이션의 개발 및 배포가 가능해졌습니다. 오늘날 빠르게 발전하는 인터넷 기술 분야에서 엔터프라이즈급 애플리케이션의 개발 및 배포가 점점 더 중요해지고 있습니다. Vue.js와 ASP.NET은 프런트엔드 및 백엔드 개발에 널리 사용되는 두 가지 기술을 결합하면 엔터프라이즈 수준 애플리케이션의 개발 및 배포에 많은 이점을 가져올 수 있습니다. 이 기사에서는 Vue.js 및 ASP.NET을 사용하여 코드 예제를 통해 엔터프라이즈 수준 애플리케이션을 개발하고 배포하는 방법을 소개합니다. 먼저, 설치해야 합니다.

ASP.NET 프로그램에서 MySQL 연결 풀을 올바르게 구성하고 사용하는 방법은 무엇입니까? 인터넷의 발달과 데이터 양의 증가로 인해 데이터베이스 접속 및 연결에 대한 수요도 증가하고 있습니다. 데이터베이스의 성능과 안정성을 향상시키기 위해서는 커넥션 풀링(Connection Pooling)이 필수적인 기술이 되었습니다. 이 기사에서는 ASP.NET 프로그램에서 MySQL 연결 풀을 올바르게 구성하고 사용하여 데이터베이스의 효율성과 응답 속도를 향상시키는 방법을 주로 소개합니다. 1. 커넥션 풀링의 개념과 기능 커넥션 풀링은 데이터베이스 커넥션을 재사용하는 기술이다.

ASP.NET 프로그램에서 MySQL 연결 풀의 트랜잭션 성능을 올바르게 사용하고 최적화하는 방법은 무엇입니까? ASP.NET 프로그램에서 데이터베이스 트랜잭션은 매우 중요한 부분입니다. 트랜잭션은 데이터베이스의 일관성과 무결성을 보장하는 동시에 더 나은 성능을 제공합니다. MySQL 데이터베이스를 사용하는 경우 연결 자원을 관리하고 성능을 최적화하기 위해 연결 풀을 사용하는 것이 필수적입니다. 먼저 MySQL 커넥션 풀의 개념을 간략하게 이해해보자. 연결 풀은 특정 수의 연결을 사전 초기화하여 만든 버퍼 풀입니다.

ASP.NET의 기본 제공 개체에는 "요청", "응답", "세션", "서버", "응용 프로그램", "HttpContext", "Cache", "Trace", "Cookie" 및 "Server.MapPath": 1. 클라이언트가 발행한 HTTP 요청을 나타내는 요청 2. 응답: 웹 서버가 클라이언트에 반환한 HTTP 응답을 나타냅니다. 클라이언트 등
