/lib/ezfile/classes/ezlog.php

https://bitbucket.org/ericsagnes/ezpublish-multisite · PHP · 226 lines · 159 code · 19 blank · 48 comment · 26 complexity · ce3355a6da665506814701fa524c33ed MD5 · raw file

  1. <?php
  2. /**
  3. * File containing the eZLog class.
  4. *
  5. * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved.
  6. * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
  7. * @version 2012.8
  8. * @package lib
  9. */
  10. /*! \defgroup eZUtils Utility classes */
  11. /*!
  12. \class eZLog ezlog.php
  13. \ingroup eZUtils
  14. */
  15. class eZLog
  16. {
  17. const MAX_LOGROTATE_FILES = 3;
  18. const MAX_LOGFILE_SIZE = 204800; // 200*1024
  19. /*!
  20. Creates a new log object.
  21. */
  22. function eZLog( )
  23. {
  24. }
  25. /*!
  26. \static
  27. \public
  28. Writes a message $message to a given file name $name and directory $dir for logging
  29. */
  30. static function write( $message, $logName = 'common.log', $dir = 'var/log' )
  31. {
  32. $fileName = $dir . '/' . $logName;
  33. $oldumask = @umask( 0 );
  34. $fileExisted = file_exists( $fileName );
  35. if ( $fileExisted and
  36. filesize( $fileName ) > eZLog::maxLogSize() )
  37. {
  38. if ( eZLog::rotateLog( $fileName ) )
  39. $fileExisted = false;
  40. }
  41. else if ( !$fileExisted and !file_exists( $dir ) )
  42. {
  43. eZDir::mkdir( $dir, false, true );
  44. }
  45. $logFile = @fopen( $fileName, "a" );
  46. if ( $logFile )
  47. {
  48. $time = strftime( "%b %d %Y %H:%M:%S", strtotime( "now" ) );
  49. $logMessage = "[ " . $time . " ] $message\n";
  50. @fwrite( $logFile, $logMessage );
  51. @fclose( $logFile );
  52. if ( !$fileExisted )
  53. {
  54. $ini = eZINI::instance();
  55. $permissions = octdec( $ini->variable( 'FileSettings', 'LogFilePermissions' ) );
  56. @chmod( $fileName, $permissions );
  57. }
  58. @umask( $oldumask );
  59. }
  60. else
  61. {
  62. eZDebug::writeError( 'Couldn\'t create the log file "' . $fileName . '"', __METHOD__ );
  63. }
  64. }
  65. /*!
  66. \private
  67. Writes file name $name and storage directory $dir to storage log
  68. */
  69. static function writeStorageLog( $name, $dir = false )
  70. {
  71. $ini = eZINI::instance();
  72. $varDir = $ini->variable( 'FileSettings', 'VarDir' );
  73. $logDir = $ini->variable( 'FileSettings', 'LogDir' );
  74. $logName = 'storage.log';
  75. $fileName = $varDir . '/' . $logDir . '/' . $logName;
  76. $oldumask = @umask( 0 );
  77. $fileExisted = file_exists( $fileName );
  78. if ( $fileExisted and
  79. filesize( $fileName ) > eZLog::maxLogSize() )
  80. {
  81. if ( eZLog::rotateLog( $fileName ) )
  82. $fileExisted = false;
  83. }
  84. else if ( !$fileExisted and !file_exists( $varDir . '/' . $logDir ) )
  85. {
  86. eZDir::mkdir( $varDir . '/' . $logDir, false, true );
  87. }
  88. if ( $dir !== false )
  89. {
  90. $dir = preg_replace( "#/$#", "", $dir );
  91. $dir .= "/";
  92. }
  93. else
  94. {
  95. $dir = "";
  96. }
  97. $logFile = @fopen( $fileName, "a" );
  98. if ( $logFile )
  99. {
  100. $time = strftime( "%b %d %Y %H:%M:%S", strtotime( "now" ) );
  101. $logMessage = "[ " . $time . " ] [" . $dir . $name . "]\n";
  102. @fwrite( $logFile, $logMessage );
  103. @fclose( $logFile );
  104. if ( !$fileExisted )
  105. {
  106. $permissions = octdec( $ini->variable( 'FileSettings', 'LogFilePermissions' ) );
  107. @chmod( $fileName, $permissions );
  108. }
  109. @umask( $oldumask );
  110. }
  111. else
  112. {
  113. eZDebug::writeError( 'Couldn\'t create the log file "' . $fileName . '"', __METHOD__ );
  114. }
  115. }
  116. /*!
  117. \static
  118. \return the maximum size for a log file in bytes.
  119. */
  120. static function maxLogSize()
  121. {
  122. $maxLogSize =& $GLOBALS['eZMaxLogSize'];
  123. if ( isset( $maxLogSize ) )
  124. {
  125. return $maxLogSize;
  126. }
  127. else if ( defined( 'CUSTOM_LOG_MAX_FILE_SIZE' ) )
  128. {
  129. self::setMaxLogSize( (int)CUSTOM_LOG_MAX_FILE_SIZE );
  130. return (int)CUSTOM_LOG_MAX_FILE_SIZE;
  131. }
  132. return self::MAX_LOGFILE_SIZE;
  133. }
  134. /*!
  135. \static
  136. Sets the maximum size for a log file to \a $size.
  137. */
  138. static function setMaxLogSize( $size )
  139. {
  140. $GLOBALS['eZMaxLogSize'] = $size;
  141. }
  142. /*!
  143. \static
  144. \return the maximum number of logrotate files to keep.
  145. */
  146. static function maxLogrotateFiles()
  147. {
  148. $maxLogrotateFiles =& $GLOBALS['eZMaxLogrotateFiles'];
  149. if ( isset( $maxLogrotateFiles ) )
  150. {
  151. return $maxLogrotateFiles;
  152. }
  153. else if ( defined( 'CUSTOM_LOG_ROTATE_FILES' ) )
  154. {
  155. self::setLogrotateFiles( (int)CUSTOM_LOG_ROTATE_FILES );
  156. return (int)CUSTOM_LOG_ROTATE_FILES;
  157. }
  158. return self::MAX_LOGROTATE_FILES;
  159. }
  160. /*!
  161. \static
  162. Rotates logfiles so the current logfile is backed up,
  163. old rotate logfiles are rotated once more and those that
  164. exceed maxLogrotateFiles() will be removed.
  165. Rotated files will get the extension .1, .2 etc.
  166. */
  167. static function rotateLog( $fileName )
  168. {
  169. $maxLogrotateFiles = eZLog::maxLogrotateFiles();
  170. if ( $maxLogrotateFiles == 0 )
  171. {
  172. return;
  173. }
  174. for ( $i = $maxLogrotateFiles; $i > 0; --$i )
  175. {
  176. $logRotateName = $fileName . '.' . $i;
  177. if ( file_exists( $logRotateName ) )
  178. {
  179. if ( $i == $maxLogrotateFiles )
  180. {
  181. @unlink( $logRotateName );
  182. }
  183. else
  184. {
  185. $newLogRotateName = $fileName . '.' . ($i + 1);
  186. eZFile::rename( $logRotateName, $newLogRotateName );
  187. }
  188. }
  189. }
  190. if ( file_exists( $fileName ) )
  191. {
  192. $newLogRotateName = $fileName . '.' . 1;
  193. eZFile::rename( $fileName, $newLogRotateName );
  194. return true;
  195. }
  196. return false;
  197. }
  198. /*!
  199. \static
  200. Sets the maximum number of logrotate files to keep to \a $files.
  201. */
  202. static function setLogrotateFiles( $files )
  203. {
  204. $GLOBALS['eZMaxLogrotateFiles'] = $files;
  205. }
  206. }
  207. ?>