You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ih...@apache.org on 2013/11/28 17:03:57 UTC
[27/43] git commit: LOG4PHP-121: Reorganized classes into namespaces
LOG4PHP-121: Reorganized classes into namespaces
Base namespace for the project is Apache\Log4php.
Also renamed classes to have a sane naming scheme, e.g.
LoggerAppenderConsole becomes ConsoleAppender, and is located in the
Apache\Log4php\Appenders namespace.
Signed-off-by: Ivan Habunek <iv...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/logging-log4php/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4php/commit/79ed2d0d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4php/tree/79ed2d0d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4php/diff/79ed2d0d
Branch: refs/heads/v3
Commit: 79ed2d0d173de51ac47d934b0f658eee30a8eb04
Parents: ae4116e
Author: Ivan Habunek <iv...@gmail.com>
Authored: Thu Nov 28 13:48:45 2013 +0100
Committer: Ivan Habunek <iv...@gmail.com>
Committed: Thu Nov 28 13:48:45 2013 +0100
----------------------------------------------------------------------
.gitignore | 3 +
composer.json | 14 +-
phpunit.xml | 15 +-
src/AppenderPool.php | 97 +
src/Appenders/AbstractAppender.php | 288 +
src/Appenders/ConsoleAppender.php | 103 +
src/Appenders/DailyFileAppender.php | 130 +
src/Appenders/EchoAppender.php | 89 +
src/Appenders/FileAppender.php | 225 +
src/Appenders/MailAppender.php | 136 +
src/Appenders/MailEventAppender.php | 180 +
src/Appenders/MongoDBAppender.php | 366 +
src/Appenders/NullAppender.php | 44 +
src/Appenders/PdoAppender.php | 287 +
src/Appenders/PhpAppender.php | 50 +
src/Appenders/RollingFileAppender.php | 303 +
src/Appenders/SocketAppender.php | 123 +
src/Appenders/SyslogAppender.php | 304 +
src/Autoloader.php | 53 +
src/Configurable.php | 118 +
src/Configuration/ConfiguratorInterface.php | 41 +
src/Configuration/DefaultConfigurator.php | 512 +
src/Configuration/adapters/AdapterInterface.php | 35 +
src/Configuration/adapters/IniAdapter.php | 294 +
src/Configuration/adapters/PhpAdapter.php | 82 +
src/Configuration/adapters/XmlAdapter.php | 277 +
src/Filters/AbstractFilter.php | 126 +
src/Filters/DenyAllFilter.php | 45 +
src/Filters/LevelMatchFilter.php | 98 +
src/Filters/LevelRangeFilter.php | 136 +
src/Filters/StringMatchFilter.php | 87 +
src/Helpers/FormattingInfo.php | 51 +
src/Helpers/OptionConverter.php | 225 +
src/Helpers/PatternParser.php | 245 +
src/Helpers/Utils.php | 120 +
src/Hierarchy.php | 256 +
src/Layouts/AbstractLayout.php | 74 +
src/Layouts/HtmlLayout.php | 197 +
src/Layouts/PatternLayout.php | 171 +
src/Layouts/SerializedLayout.php | 53 +
src/Layouts/SimpleLayout.php | 44 +
src/Layouts/XmlLayout.php | 192 +
src/Level.php | 253 +
src/LocationInfo.php | 100 +
src/Logger.php | 592 ++
src/LoggerException.php | 25 +
src/LoggingEvent.php | 366 +
src/MDC.php | 87 +
src/NDC.php | 184 +
src/Pattern/AbstractConverter.php | 130 +
src/Pattern/ClassConverter.php | 62 +
src/Pattern/CookieConverter.php | 32 +
src/Pattern/DateConverter.php | 89 +
src/Pattern/EnvironmentConverter.php | 33 +
src/Pattern/FileConverter.php | 32 +
src/Pattern/LevelConverter.php | 32 +
src/Pattern/LineConverter.php | 33 +
src/Pattern/LiteralConverter.php | 38 +
src/Pattern/LocationConverter.php | 37 +
src/Pattern/LoggerConverter.php | 64 +
src/Pattern/MdcConverter.php | 52 +
src/Pattern/MessageConverter.php | 32 +
src/Pattern/MethodConverter.php | 33 +
src/Pattern/NdcConverter.php | 32 +
src/Pattern/NewLineConverter.php | 32 +
src/Pattern/ProcessConverter.php | 32 +
src/Pattern/RelativeConverter.php | 34 +
src/Pattern/RequestConverter.php | 35 +
src/Pattern/ServerConverter.php | 35 +
src/Pattern/SessionConverter.php | 35 +
src/Pattern/SessionIdConverter.php | 31 +
src/Pattern/SuperglobalConverter.php | 100 +
src/Pattern/ThrowableConverter.php | 35 +
src/ReflectionUtils.php | 151 +
src/Renderers/DefaultRenderer.php | 33 +
src/Renderers/ExceptionRenderer.php | 33 +
src/Renderers/RendererInterface.php | 32 +
src/Renderers/RendererMap.php | 189 +
src/RootLogger.php | 69 +
src/ThrowableInformation.php | 67 +
src/assembly/src.xml | 49 -
src/changes/changes.xml | 167 -
src/examples/php/appender_console.php | 23 -
src/examples/php/appender_dailyfile.php | 23 -
src/examples/php/appender_echo.php | 23 -
src/examples/php/appender_file.php | 22 -
src/examples/php/appender_firephp.php | 120 -
src/examples/php/appender_mail.php | 24 -
src/examples/php/appender_mailevent.php | 23 -
src/examples/php/appender_mongodb.php | 22 -
src/examples/php/appender_null.php | 23 -
src/examples/php/appender_pdo.php | 23 -
src/examples/php/appender_php.php | 22 -
src/examples/php/appender_rollingfile.php | 23 -
src/examples/php/appender_socket.php | 23 -
src/examples/php/appender_socket_server.php | 72 -
src/examples/php/appender_syslog.php | 23 -
src/examples/php/cache.php | 35 -
src/examples/php/configurator_basic.php | 23 -
src/examples/php/configurator_php.php | 23 -
src/examples/php/configurator_xml.php | 24 -
src/examples/php/filter_denyall.php | 23 -
src/examples/php/filter_levelmatch.php | 24 -
src/examples/php/filter_levelrange.php | 27 -
src/examples/php/filter_stringmatch.php | 24 -
src/examples/php/layout_html.php | 23 -
src/examples/php/layout_pattern.php | 24 -
src/examples/php/layout_simple.php | 23 -
src/examples/php/layout_ttcc.php | 23 -
src/examples/php/layout_xml.php | 23 -
src/examples/php/mdc.php | 24 -
src/examples/php/ndc.php | 30 -
src/examples/php/renderer_default.php | 35 -
src/examples/php/renderer_map.php | 37 -
src/examples/php/simple.php | 36 -
.../resources/appender_console.properties | 21 -
.../resources/appender_dailyfile.properties | 22 -
src/examples/resources/appender_echo.properties | 20 -
src/examples/resources/appender_file.properties | 21 -
src/examples/resources/appender_firephp.xml | 30 -
src/examples/resources/appender_mail.properties | 23 -
.../resources/appender_mailevent.properties | 23 -
src/examples/resources/appender_mongodb.xml | 25 -
src/examples/resources/appender_null.properties | 19 -
src/examples/resources/appender_pdo.properties | 37 -
src/examples/resources/appender_php.properties | 21 -
.../resources/appender_rollingfile.properties | 23 -
.../resources/appender_socket.properties | 24 -
.../resources/appender_socket_server.properties | 24 -
.../resources/appender_syslog.properties | 23 -
src/examples/resources/cache.properties | 20 -
src/examples/resources/configurator_php.php | 39 -
src/examples/resources/configurator_xml.xml | 26 -
src/examples/resources/filter_denyall.xml | 27 -
src/examples/resources/filter_levelmatch.xml | 30 -
src/examples/resources/filter_levelrange.xml | 31 -
src/examples/resources/filter_stringmatch.xml | 30 -
src/examples/resources/layout_html.properties | 20 -
.../resources/layout_pattern.properties | 21 -
src/examples/resources/layout_simple.properties | 20 -
src/examples/resources/layout_ttcc.properties | 23 -
src/examples/resources/layout_xml.properties | 20 -
src/examples/resources/mdc.properties | 22 -
src/examples/resources/ndc.properties | 21 -
.../resources/renderer_default.properties | 20 -
src/examples/resources/renderer_map.properties | 22 -
src/main/php/Logger.php | 596 --
src/main/php/LoggerAppender.php | 286 -
src/main/php/LoggerAppenderPool.php | 98 -
src/main/php/LoggerAutoloader.php | 142 -
src/main/php/LoggerConfigurable.php | 116 -
src/main/php/LoggerConfigurator.php | 42 -
src/main/php/LoggerException.php | 28 -
src/main/php/LoggerFilter.php | 126 -
src/main/php/LoggerHierarchy.php | 257 -
src/main/php/LoggerLayout.php | 74 -
src/main/php/LoggerLevel.php | 256 -
src/main/php/LoggerLocationInfo.php | 103 -
src/main/php/LoggerLoggingEvent.php | 368 -
src/main/php/LoggerMDC.php | 88 -
src/main/php/LoggerNDC.php | 203 -
src/main/php/LoggerReflectionUtils.php | 152 -
src/main/php/LoggerRoot.php | 71 -
src/main/php/LoggerThrowableInformation.php | 68 -
.../php/appenders/LoggerAppenderConsole.php | 103 -
.../php/appenders/LoggerAppenderDailyFile.php | 130 -
src/main/php/appenders/LoggerAppenderEcho.php | 88 -
src/main/php/appenders/LoggerAppenderFile.php | 225 -
.../php/appenders/LoggerAppenderFirePHP.php | 100 -
src/main/php/appenders/LoggerAppenderMail.php | 136 -
.../php/appenders/LoggerAppenderMailEvent.php | 180 -
.../php/appenders/LoggerAppenderMongoDB.php | 360 -
src/main/php/appenders/LoggerAppenderNull.php | 44 -
src/main/php/appenders/LoggerAppenderPDO.php | 282 -
src/main/php/appenders/LoggerAppenderPhp.php | 49 -
.../php/appenders/LoggerAppenderRollingFile.php | 305 -
src/main/php/appenders/LoggerAppenderSocket.php | 122 -
src/main/php/appenders/LoggerAppenderSyslog.php | 303 -
.../LoggerConfigurationAdapter.php | 39 -
.../LoggerConfigurationAdapterINI.php | 299 -
.../LoggerConfigurationAdapterPHP.php | 84 -
.../LoggerConfigurationAdapterXML.php | 278 -
.../configurators/LoggerConfiguratorDefault.php | 477 -
src/main/php/filters/LoggerFilterDenyAll.php | 56 -
src/main/php/filters/LoggerFilterLevelMatch.php | 100 -
src/main/php/filters/LoggerFilterLevelRange.php | 138 -
.../php/filters/LoggerFilterStringMatch.php | 89 -
src/main/php/helpers/LoggerFormattingInfo.php | 54 -
src/main/php/helpers/LoggerOptionConverter.php | 226 -
src/main/php/helpers/LoggerPatternParser.php | 237 -
src/main/php/helpers/LoggerUtils.php | 123 -
src/main/php/layouts/LoggerLayoutHtml.php | 214 -
src/main/php/layouts/LoggerLayoutPattern.php | 171 -
src/main/php/layouts/LoggerLayoutSerialized.php | 55 -
src/main/php/layouts/LoggerLayoutSimple.php | 56 -
src/main/php/layouts/LoggerLayoutTTCC.php | 201 -
src/main/php/layouts/LoggerLayoutXml.php | 210 -
src/main/php/pattern/LoggerPatternConverter.php | 131 -
.../php/pattern/LoggerPatternConverterClass.php | 64 -
.../pattern/LoggerPatternConverterCookie.php | 35 -
.../php/pattern/LoggerPatternConverterDate.php | 91 -
.../LoggerPatternConverterEnvironment.php | 35 -
.../php/pattern/LoggerPatternConverterFile.php | 34 -
.../php/pattern/LoggerPatternConverterLevel.php | 34 -
.../php/pattern/LoggerPatternConverterLine.php | 35 -
.../pattern/LoggerPatternConverterLiteral.php | 40 -
.../pattern/LoggerPatternConverterLocation.php | 39 -
.../pattern/LoggerPatternConverterLogger.php | 65 -
.../php/pattern/LoggerPatternConverterMDC.php | 55 -
.../pattern/LoggerPatternConverterMessage.php | 34 -
.../pattern/LoggerPatternConverterMethod.php | 35 -
.../php/pattern/LoggerPatternConverterNDC.php | 35 -
.../pattern/LoggerPatternConverterNewLine.php | 34 -
.../pattern/LoggerPatternConverterProcess.php | 34 -
.../pattern/LoggerPatternConverterRelative.php | 36 -
.../pattern/LoggerPatternConverterRequest.php | 35 -
.../pattern/LoggerPatternConverterServer.php | 35 -
.../pattern/LoggerPatternConverterSession.php | 35 -
.../pattern/LoggerPatternConverterSessionID.php | 33 -
.../LoggerPatternConverterSuperglobal.php | 102 -
.../pattern/LoggerPatternConverterThrowable.php | 40 -
src/main/php/renderers/LoggerRenderer.php | 36 -
.../php/renderers/LoggerRendererDefault.php | 36 -
.../php/renderers/LoggerRendererException.php | 36 -
src/main/php/renderers/LoggerRendererMap.php | 186 -
src/main/php/xml/log4php.dtd | 148 -
src/site/apt/contributingpatches.apt | 112 -
src/site/apt/download.apt | 92 -
src/site/apt/index.apt | 104 -
src/site/apt/privacy-policy.apt | 49 -
src/site/apt/volunteering.apt | 44 -
src/site/cse.xml | 48 -
src/site/resources/css/bootstrap.css | 5624 -----------
src/site/resources/css/bootstrap.min.css | 9 -
src/site/resources/css/site.css | 79 -
src/site/resources/images/collapsed.gif | Bin 820 -> 0 bytes
src/site/resources/images/expanded.gif | Bin 52 -> 0 bytes
src/site/resources/images/logos/ls-logo.jpg | Bin 41915 -> 0 bytes
.../resources/images/logos/maven-feather.png | Bin 3330 -> 0 bytes
.../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes
src/site/resources/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes
src/site/resources/js/bootstrap.js | 2027 ----
src/site/resources/js/bootstrap.min.js | 6 -
src/site/resources/js/jquery.js | 9266 ------------------
src/site/resources/js/jquery.min.js | 4 -
src/site/resources/js/prettify.js | 1477 ---
src/site/resources/js/prettify.min.js | 41 -
src/site/resources/js/site.js | 106 -
src/site/site.vm | 485 -
src/site/site.xml | 108 -
src/site/xdoc/changelog.xml | 182 -
src/site/xdoc/docs/appenders.xml | 191 -
src/site/xdoc/docs/appenders/console.xml | 108 -
src/site/xdoc/docs/appenders/daily-file.xml | 169 -
src/site/xdoc/docs/appenders/echo.xml | 112 -
src/site/xdoc/docs/appenders/file.xml | 125 -
src/site/xdoc/docs/appenders/firephp.xml | 115 -
src/site/xdoc/docs/appenders/mail-event.xml | 145 -
src/site/xdoc/docs/appenders/mail.xml | 137 -
src/site/xdoc/docs/appenders/mongodb.xml | 169 -
src/site/xdoc/docs/appenders/null.xml | 78 -
src/site/xdoc/docs/appenders/pdo.xml | 444 -
src/site/xdoc/docs/appenders/php.xml | 91 -
src/site/xdoc/docs/appenders/rolling-file.xml | 155 -
src/site/xdoc/docs/appenders/socket.xml | 146 -
src/site/xdoc/docs/appenders/syslog.xml | 355 -
src/site/xdoc/docs/configuration.xml | 285 -
src/site/xdoc/docs/filters.xml | 327 -
src/site/xdoc/docs/introduction.xml | 98 -
src/site/xdoc/docs/layouts.xml | 75 -
src/site/xdoc/docs/layouts/html.xml | 202 -
src/site/xdoc/docs/layouts/pattern.xml | 655 --
src/site/xdoc/docs/layouts/serialized.xml | 122 -
src/site/xdoc/docs/layouts/simple.xml | 104 -
src/site/xdoc/docs/layouts/ttcc.xml | 162 -
src/site/xdoc/docs/layouts/xml.xml | 189 -
src/site/xdoc/docs/loggers.xml | 289 -
src/site/xdoc/docs/renderers.xml | 218 -
src/site/xdoc/install.xml | 89 -
src/site/xdoc/privacy.xml | 53 -
src/site/xdoc/quickstart.xml | 208 -
src/test/config/phpunit_to_surefire.xslt | 38 -
src/test/php/LoggerAppenderPoolTest.php | 65 -
src/test/php/LoggerAppenderTest.php | 173 -
src/test/php/LoggerConfiguratorTest.php | 452 -
src/test/php/LoggerExceptionTest.php | 41 -
src/test/php/LoggerFilterTest.php | 49 -
src/test/php/LoggerHierarchyTest.php | 100 -
src/test/php/LoggerLevelTest.php | 84 -
src/test/php/LoggerLoggingEventTest.php | 135 -
src/test/php/LoggerMDCTest.php | 116 -
src/test/php/LoggerNDCTest.php | 92 -
src/test/php/LoggerReflectionUtilsTest.php | 89 -
src/test/php/LoggerRootTest.php | 63 -
src/test/php/LoggerTest.php | 223 -
src/test/php/LoggerTestHelper.php | 156 -
src/test/php/LoggerThrowableInformationTest.php | 74 -
src/test/php/README | 19 -
.../php/appenders/LoggerAppenderConsoleTest.php | 89 -
.../appenders/LoggerAppenderDailyFileTest.php | 190 -
.../php/appenders/LoggerAppenderEchoTest.php | 165 -
.../php/appenders/LoggerAppenderFileTest.php | 135 -
.../php/appenders/LoggerAppenderFirephpTest.php | 201 -
.../appenders/LoggerAppenderMailEventTest.php | 81 -
.../php/appenders/LoggerAppenderMailTest.php | 60 -
.../php/appenders/LoggerAppenderMongoDBTest.php | 207 -
.../php/appenders/LoggerAppenderNullTest.php | 47 -
.../php/appenders/LoggerAppenderPDOTest.php | 164 -
.../php/appenders/LoggerAppenderPhpTest.php | 97 -
.../appenders/LoggerAppenderRollingFileTest.php | 206 -
.../php/appenders/LoggerAppenderSocketTest.php | 149 -
.../php/appenders/LoggerAppenderSyslogTest.php | 264 -
src/test/php/appenders/socketServer.php | 98 -
src/test/php/bootstrap.php | 45 -
.../LoggerConfigurationAdapterINITest.php | 173 -
.../LoggerConfigurationAdapterPHPTest.php | 99 -
.../LoggerConfigurationAdapterXMLTest.php | 175 -
.../php/filters/LoggerFilterDenyAllTest.php | 71 -
.../php/filters/LoggerFilterLevelMatchTest.php | 181 -
.../php/filters/LoggerFilterLevelRangeTest.php | 70 -
.../php/filters/LoggerFilterStringMatchTest.php | 113 -
.../php/helpers/LoggerOptionConverterTest.php | 147 -
.../php/helpers/LoggerPatternParserTest.php | 55 -
src/test/php/helpers/LoggerUtilsTest.php | 88 -
src/test/php/layouts/LoggerLayoutHtmlTest.php | 95 -
.../php/layouts/LoggerLayoutPatternTest.php | 54 -
.../php/layouts/LoggerLayoutSerializedTest.php | 107 -
src/test/php/layouts/LoggerLayoutSimpleTest.php | 40 -
src/test/php/layouts/LoggerLayoutTTCCTest.php | 68 -
src/test/php/layouts/LoggerLayoutXmlTest.php | 148 -
.../php/pattern/LoggerPatternConverterTest.php | 384 -
.../php/renderers/LoggerRendererMapTest.php | 243 -
.../config_invalid_appender_declaration_1.ini | 24 -
.../config_invalid_appender_declaration_2.ini | 24 -
.../adapters/ini/config_invalid_syntax.ini | 19 -
.../configs/adapters/ini/config_valid.ini | 41 -
.../resources/configs/adapters/ini/values.ini | 25 -
.../configs/adapters/php/config_empty.php | 28 -
.../adapters/php/config_invalid_syntax.php | 42 -
.../adapters/php/config_not_an_array.php | 29 -
.../configs/adapters/php/config_valid.php | 42 -
.../adapters/xml/config_duplicate_logger.xml | 39 -
.../adapters/xml/config_duplicate_renderer.xml | 30 -
.../adapters/xml/config_invalid_syntax.xml | 39 -
.../configs/adapters/xml/config_valid.xml | 54 -
.../adapters/xml/config_valid_underscore.xml | 57 -
.../appenders/config_invalid_appender_class.xml | 25 -
.../appenders/config_invalid_filter_class.xml | 27 -
.../config_invalid_filter_parameters.xml | 29 -
.../appenders/config_invalid_layout_class.xml | 27 -
.../configs/appenders/config_no_class.xml | 26 -
.../appenders/config_no_layout_class.xml | 27 -
.../appenders/config_not_existing_class.xml | 25 -
.../config_not_existing_filter_class.xml | 27 -
.../config_not_existing_layout_class.xml | 27 -
src/test/resources/configs/config.yml | 14 -
src/test/resources/configs/config1.xml | 54 -
.../loggers/config_invalid_additivity.xml | 30 -
.../loggers/config_not_existing_appenders.xml | 23 -
.../renderers/config_default_renderer.xml | 27 -
.../config_invalid_rendering_class.xml | 29 -
.../renderers/config_no_rendered_class.xml | 29 -
.../renderers/config_no_rendering_class.xml | 29 -
.../config_not_existing_rendering_class.xml | 29 -
tests/bootstrap.php | 45 +
tests/config/phpunit_to_surefire.xslt | 38 +
.../config_invalid_appender_declaration_1.ini | 23 +
.../config_invalid_appender_declaration_2.ini | 23 +
.../adapters/ini/config_invalid_syntax.ini | 19 +
.../configs/adapters/ini/config_valid.ini | 41 +
tests/resources/configs/adapters/ini/values.ini | 25 +
.../configs/adapters/php/config_empty.php | 26 +
.../adapters/php/config_invalid_syntax.php | 40 +
.../adapters/php/config_not_an_array.php | 27 +
.../configs/adapters/php/config_valid.php | 40 +
.../adapters/xml/config_duplicate_logger.xml | 39 +
.../adapters/xml/config_duplicate_renderer.xml | 30 +
.../adapters/xml/config_invalid_syntax.xml | 39 +
.../configs/adapters/xml/config_valid.xml | 54 +
.../adapters/xml/config_valid_underscore.xml | 57 +
.../appenders/config_invalid_appender_class.xml | 25 +
.../appenders/config_invalid_filter_class.xml | 27 +
.../config_invalid_filter_parameters.xml | 29 +
.../appenders/config_invalid_layout_class.xml | 27 +
.../configs/appenders/config_no_class.xml | 26 +
.../appenders/config_no_layout_class.xml | 27 +
.../appenders/config_not_existing_class.xml | 25 +
.../config_not_existing_filter_class.xml | 27 +
.../config_not_existing_layout_class.xml | 27 +
tests/resources/configs/config.yml | 14 +
tests/resources/configs/config1.xml | 54 +
.../loggers/config_invalid_additivity.xml | 30 +
.../loggers/config_not_existing_appenders.xml | 23 +
.../renderers/config_default_renderer.xml | 27 +
.../config_invalid_rendering_class.xml | 29 +
.../renderers/config_no_rendered_class.xml | 29 +
.../renderers/config_no_rendering_class.xml | 29 +
.../config_not_existing_rendering_class.xml | 29 +
tests/src/AppenderPoolTest.php | 84 +
tests/src/AppenderTest.php | 181 +
tests/src/Appenders/ConsoleAppenderTest.php | 91 +
tests/src/Appenders/DailyFileAppenderTest.php | 194 +
tests/src/Appenders/EchoAppenderTest.php | 170 +
tests/src/Appenders/FileAppenderTest.php | 139 +
tests/src/Appenders/MailAppenderTest.php | 64 +
tests/src/Appenders/MailEventAppenderTest.php | 86 +
tests/src/Appenders/MongoDBAppenderTest.php | 213 +
tests/src/Appenders/NullAppenderTest.php | 51 +
tests/src/Appenders/PDOAppenderTest.php | 170 +
tests/src/Appenders/PhpAppenderTest.php | 98 +
tests/src/Appenders/RollingFileAppenderTest.php | 212 +
tests/src/Appenders/SocketAppenderTest.php | 151 +
tests/src/Appenders/SyslogAppenderTest.php | 253 +
tests/src/Appenders/socketServer.php | 95 +
tests/src/ConfiguratorTest.php | 453 +
tests/src/Configurators/INIAdapterTest.php | 177 +
tests/src/Configurators/PHPAdapterTest.php | 101 +
tests/src/Configurators/XMLAdapterTest.php | 178 +
tests/src/ExceptionTest.php | 42 +
tests/src/FilterTest.php | 54 +
tests/src/Filters/FilterDenyAllTest.php | 75 +
tests/src/Filters/FilterLevelMatchTest.php | 184 +
tests/src/Filters/FilterLevelRangeTest.php | 75 +
tests/src/Filters/FilterStringMatchTest.php | 118 +
tests/src/Helpers/OptionConverterTest.php | 149 +
tests/src/Helpers/PatternParserTest.php | 54 +
tests/src/Helpers/UtilsTest.php | 89 +
tests/src/HierarchyTest.php | 105 +
tests/src/Layouts/HtmlLayoutTest.php | 99 +
tests/src/Layouts/PatternLayoutTest.php | 56 +
tests/src/Layouts/SerializedLayoutTest.php | 110 +
tests/src/Layouts/SimpleLayoutTest.php | 43 +
tests/src/Layouts/XmlLayoutTest.php | 153 +
tests/src/LevelTest.php | 86 +
tests/src/LoggerTest.php | 225 +
tests/src/LoggingEventTest.php | 139 +
tests/src/MDCTest.php | 119 +
tests/src/NDCTest.php | 94 +
tests/src/Pattern/PatternConverterTest.php | 415 +
tests/src/README | 19 +
tests/src/ReflectionUtilsTest.php | 91 +
tests/src/Renderers/RendererMapTest.php | 249 +
tests/src/RootLoggerTest.php | 67 +
tests/src/TestHelper.php | 160 +
tests/src/ThrowableInformationTest.php | 58 +
445 files changed, 16919 insertions(+), 45094 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 957eace..4f8d6df 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
+composer.lock
target
temp
+tmp
+vendor
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/composer.json
----------------------------------------------------------------------
diff --git a/composer.json b/composer.json
index 2859e7e..dc14081 100644
--- a/composer.json
+++ b/composer.json
@@ -10,10 +10,16 @@
"source": "https://svn.apache.org/repos/asf/logging/log4php",
"email": "log4php-user@logging.apache.org"
},
- "autoload": {
- "classmap": ["src/main/php/"]
- },
"require": {
- "php": ">=5.2.7"
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "apigen/apigen": "2.*",
+ "mockery/mockery": "0.*",
+ "netcarver/textile": "3.5.*",
+ "phing/phing": "2.*",
+ "phpunit/phpunit": "3.7.*",
+ "squizlabs/php_codesniffer": "1.*",
+ "twig/twig": "1.*"
}
}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/phpunit.xml
----------------------------------------------------------------------
diff --git a/phpunit.xml b/phpunit.xml
index 58fa534..44d191e 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -15,7 +15,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
- <phpunit bootstrap="src/test/php/bootstrap.php"
+<phpunit bootstrap="tests/bootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
@@ -23,18 +23,21 @@
stopOnFailure="false">
<testsuite name="log4php">
- <directory>src/test/php</directory>
+ <directory>tests/src</directory>
</testsuite>
-
+
<filter>
<whitelist>
- <directory suffix=".php">src/main/php</directory>
+ <directory suffix=".php">src/</directory>
</whitelist>
</filter>
-
+
<logging>
- <log type="coverage-html" target="target/test/report" charset="UTF-8"
+ <log type="coverage-html" target="target/test/report" charset="UTF-8"
yui="true" highlight="false" lowUpperBound="35" highLowerBound="70"/>
</logging>
+ <listeners>
+ <listener class="\Mockery\Adapter\Phpunit\TestListenerxxx"></listener>
+ </listeners>
</phpunit>
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/AppenderPool.php
----------------------------------------------------------------------
diff --git a/src/AppenderPool.php b/src/AppenderPool.php
new file mode 100644
index 0000000..ca57179
--- /dev/null
+++ b/src/AppenderPool.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php;
+
+use Apache\Log4php\Appenders\AbstractAppender;
+
+/**
+ * Pool implmentation for Appender instances.
+ *
+ * The pool is used when configuring log4php. First all appender instances
+ * are created in the pool. Afterward, they are linked to loggers, each
+ * appender can be linked to multiple loggers. This makes sure duplicate
+ * appenders are not created.
+ */
+class AppenderPool {
+
+ /** Holds appenders indexed by their name */
+ public static $appenders = array();
+
+ /**
+ * Adds an appender to the pool.
+ * The appender must be named for this operation.
+ * @param Appender $appender
+ */
+ public static function add(AbstractAppender $appender) {
+ $name = $appender->getName();
+
+ if(empty($name)) {
+ trigger_error('log4php: Cannot add unnamed appender to pool.', E_USER_WARNING);
+ return;
+ }
+
+ if (isset(self::$appenders[$name])) {
+ trigger_error("log4php: Appender [$name] already exists in pool. Overwriting existing appender.", E_USER_WARNING);
+ }
+
+ self::$appenders[$name] = $appender;
+ }
+
+ /**
+ * Retrieves an appender from the pool by name.
+ * @param string $name Name of the appender to retrieve.
+ * @return Appender The named appender or NULL if no such appender
+ * exists in the pool.
+ */
+ public static function get($name) {
+ return isset(self::$appenders[$name]) ? self::$appenders[$name] : null;
+ }
+
+ /**
+ * Removes an appender from the pool by name.
+ * @param string $name Name of the appender to remove.
+ */
+ public static function delete($name) {
+ unset(self::$appenders[$name]);
+ }
+
+ /**
+ * Returns all appenders from the pool.
+ * @return array Array of Appender objects.
+ */
+ public static function getAppenders() {
+ return self::$appenders;
+ }
+
+ /**
+ * Checks whether an appender exists in the pool.
+ * @param string $name Name of the appender to look for.
+ * @return boolean TRUE if the appender with the given name exists.
+ */
+ public static function exists($name) {
+ return isset(self::$appenders[$name]);
+ }
+
+ /**
+ * Clears all appenders from the pool.
+ */
+ public static function clear() {
+ self::$appenders = array();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/AbstractAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/AbstractAppender.php b/src/Appenders/AbstractAppender.php
new file mode 100644
index 0000000..9ac29e1
--- /dev/null
+++ b/src/Appenders/AbstractAppender.php
@@ -0,0 +1,288 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\Configurable;
+use Apache\Log4php\Filters\AbstractFilter;
+use Apache\Log4php\Layouts\SimpleLayout;
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * Abstract class that defines output logs strategies.
+ */
+abstract class AbstractAppender extends Configurable {
+
+ /**
+ * Set to true when the appender is closed. A closed appender will not
+ * accept any logging requests.
+ * @var boolean
+ */
+ protected $closed = false;
+
+ /**
+ * The first filter in the filter chain.
+ * @var AbstractFilter
+ */
+ protected $filter;
+
+ /**
+ * The appender's layout. Can be null if the appender does not use
+ * a layout.
+ * @var Layout
+ */
+ protected $layout;
+
+ /**
+ * Appender name. Used by other components to identify this appender.
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Appender threshold level. Events whose level is below the threshold
+ * will not be logged.
+ * @var Level
+ */
+ protected $threshold;
+
+ /**
+ * Set to true if the appender requires a layout.
+ *
+ * True by default, appenders which do not use a layout should override
+ * this property to false.
+ *
+ * @var boolean
+ */
+ protected $requiresLayout = true;
+
+ /**
+ * Default constructor.
+ * @param string $name Appender name
+ */
+ public function __construct($name = '') {
+ $this->name = $name;
+
+ if ($this->requiresLayout) {
+ $this->layout = $this->getDefaultLayout();
+ }
+ }
+
+ public function __destruct() {
+ $this->close();
+ }
+
+ /**
+ * Returns the default layout for this appender. Can be overriden by
+ * derived appenders.
+ *
+ * @return Layout
+ */
+ public function getDefaultLayout() {
+ return new SimpleLayout();
+ }
+
+ /**
+ * Adds a filter to the end of the filter chain.
+ * @param AbstractFilter $filter add a new AbstractFilter
+ */
+ public function addFilter($filter) {
+ if($this->filter === null) {
+ $this->filter = $filter;
+ } else {
+ $this->filter->addNext($filter);
+ }
+ }
+
+ /**
+ * Clears the filter chain by removing all the filters in it.
+ */
+ public function clearFilters() {
+ $this->filter = null;
+ }
+
+ /**
+ * Returns the first filter in the filter chain.
+ * The return value may be <i>null</i> if no is filter is set.
+ * @return AbstractFilter
+ */
+ public function getFilter() {
+ return $this->filter;
+ }
+
+ /**
+ * Returns the first filter in the filter chain.
+ * The return value may be <i>null</i> if no is filter is set.
+ * @return AbstractFilter
+ */
+ public function getFirstFilter() {
+ return $this->filter;
+ }
+
+ /**
+ * Performs threshold checks and invokes filters before delegating logging
+ * to the subclass' specific <i>append()</i> method.
+ * @see Appender::append()
+ * @param LoggingEvent $event
+ */
+ public function doAppend(LoggingEvent $event) {
+ if($this->closed) {
+ return;
+ }
+
+ if(!$this->isAsSevereAsThreshold($event->getLevel())) {
+ return;
+ }
+
+ $filter = $this->getFirstFilter();
+ while($filter !== null) {
+ switch ($filter->decide($event)) {
+ case AbstractFilter::DENY: return;
+ case AbstractFilter::ACCEPT: return $this->append($event);
+ case AbstractFilter::NEUTRAL: $filter = $filter->getNext();
+ }
+ }
+ $this->append($event);
+ }
+
+ /**
+ * Sets the appender layout.
+ * @param Layout $layout
+ */
+ public function setLayout($layout) {
+ if($this->requiresLayout()) {
+ $this->layout = $layout;
+ }
+ }
+
+ /**
+ * Returns the appender layout.
+ * @return Layout
+ */
+ public function getLayout() {
+ return $this->layout;
+ }
+
+ /**
+ * Configurators call this method to determine if the appender
+ * requires a layout.
+ *
+ * <p>If this method returns <i>true</i>, meaning that layout is required,
+ * then the configurator will configure a layout using the configuration
+ * information at its disposal. If this method returns <i>false</i>,
+ * meaning that a layout is not required, then layout configuration will be
+ * skipped even if there is available layout configuration
+ * information at the disposal of the configurator.</p>
+ *
+ * <p>In the rather exceptional case, where the appender
+ * implementation admits a layout but can also work without it, then
+ * the appender should return <i>true</i>.</p>
+ *
+ * @return boolean
+ */
+ public function requiresLayout() {
+ return $this->requiresLayout;
+ }
+
+ /**
+ * Retruns the appender name.
+ * @return string
+ */
+ public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * Sets the appender name.
+ * @param string $name
+ */
+ public function setName($name) {
+ $this->name = $name;
+ }
+
+ /**
+ * Returns the appender's threshold level.
+ * @return Level
+ */
+ public function getThreshold() {
+ return $this->threshold;
+ }
+
+ /**
+ * Sets the appender threshold.
+ *
+ * @param Level|string $threshold Either a {@link Level}
+ * object or a string equivalent.
+ * @see OptionConverter::toLevel()
+ */
+ public function setThreshold($threshold) {
+ $this->setLevel('threshold', $threshold);
+ }
+
+ /**
+ * Checks whether the message level is below the appender's threshold.
+ *
+ * If there is no threshold set, then the return value is always <i>true</i>.
+ *
+ * @param Level $level
+ * @return boolean Returns true if level is greater or equal than
+ * threshold, or if the threshold is not set. Otherwise returns false.
+ */
+ public function isAsSevereAsThreshold($level) {
+ if($this->threshold === null) {
+ return true;
+ }
+ return $level->isGreaterOrEqual($this->getThreshold());
+ }
+
+ /**
+ * Prepares the appender for logging.
+ *
+ * Derived appenders should override this method if option structure
+ * requires it.
+ */
+ public function activateOptions() {
+ $this->closed = false;
+ }
+
+ /**
+ * Forwards the logging event to the destination.
+ *
+ * Derived appenders should implement this method to perform actual logging.
+ *
+ * @param LoggingEvent $event
+ */
+ abstract protected function append(LoggingEvent $event);
+
+ /**
+ * Releases any resources allocated by the appender.
+ *
+ * Derived appenders should override this method to perform proper closing
+ * procedures.
+ */
+ public function close() {
+ $this->closed = true;
+ }
+
+ /** Triggers a warning for this logger with the given message. */
+ protected function warn($message) {
+ $id = get_class($this) . (empty($this->name) ? '' : ":{$this->name}");
+ trigger_error("log4php: [$id]: $message", E_USER_WARNING);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/ConsoleAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/ConsoleAppender.php b/src/Appenders/ConsoleAppender.php
new file mode 100644
index 0000000..def5230
--- /dev/null
+++ b/src/Appenders/ConsoleAppender.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * ConsoleAppender appends log events either to the standard output
+ * stream (php://stdout) or the standard error stream (php://stderr).
+ *
+ * **Note**: Use this Appender with command-line php scripts. On web scripts
+ * this appender has no effects.
+ *
+ * This appender uses a layout.
+ *
+ * ## Configurable parameters: ##
+ *
+ * - **target** - the target stream: "stdout" or "stderr"
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/console.html Appender documentation
+ */
+ class ConsoleAppender extends AbstractAppender {
+
+ /** The standard otuput stream. */
+ const STDOUT = 'php://stdout';
+
+ /** The standard error stream.*/
+ const STDERR = 'php://stderr';
+
+ /** The 'target' parameter. */
+ protected $target = self::STDOUT;
+
+ /**
+ * Stream resource for the target stream.
+ * @var resource
+ */
+ protected $fp = null;
+
+ public function activateOptions() {
+ $this->fp = fopen($this->target, 'w');
+ if(is_resource($this->fp) && $this->layout !== null) {
+ fwrite($this->fp, $this->layout->getHeader());
+ }
+ $this->closed = (bool)is_resource($this->fp) === false;
+ }
+
+
+ public function close() {
+ if($this->closed != true) {
+ if (is_resource($this->fp) && $this->layout !== null) {
+ fwrite($this->fp, $this->layout->getFooter());
+ fclose($this->fp);
+ }
+ $this->closed = true;
+ }
+ }
+
+ public function append(LoggingEvent $event) {
+ if (is_resource($this->fp) && $this->layout !== null) {
+ fwrite($this->fp, $this->layout->format($event));
+ }
+ }
+
+ /**
+ * Sets the 'target' parameter.
+ * @param string $target
+ */
+ public function setTarget($target) {
+ $value = trim($target);
+ if ($value == self::STDOUT || strtoupper($value) == 'STDOUT') {
+ $this->target = self::STDOUT;
+ } elseif ($value == self::STDERR || strtoupper($value) == 'STDERR') {
+ $this->target = self::STDERR;
+ } else {
+ $target = var_export($target);
+ $this->warn("Invalid value given for 'target' property: [$target]. Property not set.");
+ }
+ }
+
+ /**
+ * Returns the value of the 'target' parameter.
+ * @return string
+ */
+ public function getTarget() {
+ return $this->target;
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/DailyFileAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/DailyFileAppender.php b/src/Appenders/DailyFileAppender.php
new file mode 100644
index 0000000..7ca1cc7
--- /dev/null
+++ b/src/Appenders/DailyFileAppender.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * An Appender that automatically creates a new logfile each day.
+ *
+ * The file is rolled over once a day. That means, for each day a new file
+ * is created. A formatted version of the date pattern is used as to create
+ * the file name using the {@link PHP_MANUAL#sprintf} function.
+ *
+ * This appender uses a layout.
+ *
+ * ##Configurable parameters:##
+ *
+ * - **datePattern** - Format for the date in the file path, follows formatting
+ * rules used by the PHP date() function. Default value: "Ymd".
+ * - **file** - Path to the target file. Should contain a %s which gets
+ * substituted by the date.
+ * - **append** - If set to true, the appender will append to the file,
+ * otherwise the file contents will be overwritten. Defaults to true.
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/daily-file.html Appender documentation
+ */
+class DailyFileAppender extends FileAppender {
+
+ /**
+ * The 'datePattern' parameter.
+ * Determines how date will be formatted in file name.
+ * @var string
+ */
+ protected $datePattern = "Ymd";
+
+ /**
+ * Current date which was used when opening a file.
+ * Used to determine if a rollover is needed when the date changes.
+ * @var string
+ */
+ protected $currentDate;
+
+ /** Additional validation for the date pattern. */
+ public function activateOptions() {
+ parent::activateOptions();
+
+ if (empty($this->datePattern)) {
+ $this->warn("Required parameter 'datePattern' not set. Closing appender.");
+ $this->closed = true;
+ return;
+ }
+ }
+
+ /**
+ * Appends a logging event.
+ *
+ * If the target file changes because of passage of time (e.g. at midnight)
+ * the current file is closed. A new file, with the new date, will be
+ * opened by the write() method.
+ */
+ public function append(LoggingEvent $event) {
+ $eventDate = $this->getDate($event->getTimestamp());
+
+ // Initial setting of current date
+ if (!isset($this->currentDate)) {
+ $this->currentDate = $eventDate;
+ }
+
+ // Check if rollover is needed
+ else if ($this->currentDate !== $eventDate) {
+ $this->currentDate = $eventDate;
+
+ // Close the file if it's open.
+ // Note: $this->close() is not called here because it would set
+ // $this->closed to true and the appender would not recieve
+ // any more logging requests
+ if (is_resource($this->fp)) {
+ $this->write($this->layout->getFooter());
+ fclose($this->fp);
+ }
+ $this->fp = null;
+ }
+
+ parent::append($event);
+ }
+
+ /** Renders the date using the configured <var>datePattern<var>. */
+ protected function getDate($timestamp = null) {
+ return date($this->datePattern, $timestamp);
+ }
+
+ /**
+ * Determines target file. Replaces %s in file path with a date.
+ */
+ protected function getTargetFile() {
+ return str_replace('%s', $this->currentDate, $this->file);
+ }
+
+ /**
+ * Sets the 'datePattern' parameter.
+ * @param string $datePattern
+ */
+ public function setDatePattern($datePattern) {
+ $this->setString('datePattern', $datePattern);
+ }
+
+ /**
+ * Returns the 'datePattern' parameter.
+ * @return string
+ */
+ public function getDatePattern() {
+ return $this->datePattern;
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/EchoAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/EchoAppender.php b/src/Appenders/EchoAppender.php
new file mode 100644
index 0000000..1b47ff9
--- /dev/null
+++ b/src/Appenders/EchoAppender.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * EchoAppender uses the PHP echo() function to output events.
+ *
+ * This appender uses a layout.
+ *
+ * ## Configurable parameters: ##
+ *
+ * - **htmlLineBreaks** - If set to true, a <br /> element will be inserted
+ * before each line break in the logged message. Default is false.
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/echo.html Appender documentation
+ */
+class EchoAppender extends AbstractAppender
+{
+ /**
+ * Used to mark first append. Set to false after first append.
+ * @var boolean
+ */
+ protected $firstAppend = true;
+
+ /**
+ * If set to true, a <br /> element will be inserted before each line
+ * break in the logged message. Default value is false. @var boolean
+ */
+ protected $htmlLineBreaks = false;
+
+ public function close() {
+ if($this->closed != true) {
+ if(!$this->firstAppend) {
+ echo $this->layout->getFooter();
+ }
+ }
+ $this->closed = true;
+ }
+
+ public function append(LoggingEvent $event) {
+ if($this->layout !== null) {
+ if($this->firstAppend) {
+ echo $this->layout->getHeader();
+ $this->firstAppend = false;
+ }
+ $text = $this->layout->format($event);
+
+ if ($this->htmlLineBreaks) {
+ $text = nl2br($text);
+ }
+ echo $text;
+ }
+ }
+
+ /**
+ * Sets the 'htmlLineBreaks' parameter.
+ * @param boolean $value
+ */
+ public function setHtmlLineBreaks($value) {
+ $this->setBoolean('htmlLineBreaks', $value);
+ }
+
+ /**
+ * Returns the 'htmlLineBreaks' parameter.
+ * @returns boolean
+ */
+ public function getHtmlLineBreaks() {
+ return $this->htmlLineBreaks;
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/FileAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/FileAppender.php b/src/Appenders/FileAppender.php
new file mode 100644
index 0000000..5f0cfd4
--- /dev/null
+++ b/src/Appenders/FileAppender.php
@@ -0,0 +1,225 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * FileAppender appends log events to a file.
+ *
+ * This appender uses a layout.
+ *
+ * ## Configurable parameters: ##
+ *
+ * - **file** - Path to the target file. Relative paths are resolved based on
+ * the working directory.
+ * - **append** - If set to true, the appender will append to the file,
+ * otherwise the file contents will be overwritten.
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/file.html Appender documentation
+ */
+class FileAppender extends AbstractAppender {
+
+ /**
+ * If set to true, the file is locked before appending. This allows
+ * concurrent access. However, appending without locking is faster so
+ * it should be used where appropriate.
+ *
+ * TODO: make this a configurable parameter
+ *
+ * @var boolean
+ */
+ protected $locking = true;
+
+ /**
+ * If set to true, appends to file. Otherwise overwrites it.
+ * @var boolean
+ */
+ protected $append = true;
+
+ /**
+ * Path to the target file.
+ * @var string
+ */
+ protected $file;
+
+ /**
+ * The file resource.
+ * @var resource
+ */
+ protected $fp;
+
+ /**
+ * Helper function which can be easily overriden by daily file appender.
+ */
+ protected function getTargetFile() {
+ return $this->file;
+ }
+
+ /**
+ * Acquires the target file resource, creates the destination folder if
+ * necessary. Writes layout header to file.
+ *
+ * @return boolean FALSE if opening failed
+ */
+ protected function openFile() {
+ $file = $this->getTargetFile();
+
+ // Create the target folder if needed
+ if(!is_file($file)) {
+ $dir = dirname($file);
+
+ if(!is_dir($dir)) {
+ $success = mkdir($dir, 0777, true);
+ if ($success === false) {
+ $this->warn("Failed creating target directory [$dir]. Closing appender.");
+ $this->closed = true;
+ return false;
+ }
+ }
+ }
+
+ $mode = $this->append ? 'a' : 'w';
+ $this->fp = fopen($file, $mode);
+ if ($this->fp === false) {
+ $this->warn("Failed opening target file. Closing appender.");
+ $this->fp = null;
+ $this->closed = true;
+ return false;
+ }
+
+ // Required when appending with concurrent access
+ if($this->append) {
+ fseek($this->fp, 0, SEEK_END);
+ }
+
+ // Write the header
+ $this->write($this->layout->getHeader());
+ }
+
+ /**
+ * Writes a string to the target file. Opens file if not already open.
+ * @param string $string Data to write.
+ */
+ protected function write($string) {
+ // Lazy file open
+ if(!isset($this->fp)) {
+ if ($this->openFile() === false) {
+ return; // Do not write if file open failed.
+ }
+ }
+
+ if ($this->locking) {
+ $this->writeWithLocking($string);
+ } else {
+ $this->writeWithoutLocking($string);
+ }
+ }
+
+ protected function writeWithLocking($string) {
+ if(flock($this->fp, LOCK_EX)) {
+ if(fwrite($this->fp, $string) === false) {
+ $this->warn("Failed writing to file. Closing appender.");
+ $this->closed = true;
+ }
+ flock($this->fp, LOCK_UN);
+ } else {
+ $this->warn("Failed locking file for writing. Closing appender.");
+ $this->closed = true;
+ }
+ }
+
+ protected function writeWithoutLocking($string) {
+ if(fwrite($this->fp, $string) === false) {
+ $this->warn("Failed writing to file. Closing appender.");
+ $this->closed = true;
+ }
+ }
+
+ public function activateOptions() {
+ if (empty($this->file)) {
+ $this->warn("Required parameter 'file' not set. Closing appender.");
+ $this->closed = true;
+ return;
+ }
+ }
+
+ public function close() {
+ if (is_resource($this->fp)) {
+ $this->write($this->layout->getFooter());
+ fclose($this->fp);
+ }
+ $this->fp = null;
+ $this->closed = true;
+ }
+
+ public function append(LoggingEvent $event) {
+ $this->write($this->layout->format($event));
+ }
+
+ /**
+ * Sets the 'file' parameter.
+ * @param string $file
+ */
+ public function setFile($file) {
+ $this->setString('file', $file);
+ }
+
+ /**
+ * Returns the 'file' parameter.
+ * @return string
+ */
+ public function getFile() {
+ return $this->file;
+ }
+
+ /**
+ * Returns the 'append' parameter.
+ * @return boolean
+ */
+ public function getAppend() {
+ return $this->append;
+ }
+
+ /**
+ * Sets the 'append' parameter.
+ * @param boolean $append
+ */
+ public function setAppend($append) {
+ $this->setBoolean('append', $append);
+ }
+
+ /**
+ * Sets the 'file' parmeter. Left for legacy reasons.
+ * @param string $fileName
+ * @deprecated Use setFile() instead.
+ */
+ public function setFileName($fileName) {
+ $this->setFile($fileName);
+ }
+
+ /**
+ * Returns the 'file' parmeter. Left for legacy reasons.
+ * @return string
+ * @deprecated Use getFile() instead.
+ */
+ public function getFileName() {
+ return $this->getFile();
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/MailAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/MailAppender.php b/src/Appenders/MailAppender.php
new file mode 100644
index 0000000..796167e
--- /dev/null
+++ b/src/Appenders/MailAppender.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * MailAppender appends log events via email.
+ *
+ * This appender does not send individual emails for each logging requests but
+ * will collect them in a buffer and send them all in a single email once the
+ * appender is closed (i.e. when the script exists). Because of this, it may
+ * not appropriate for long running scripts, in which case
+ * MailEventAppender might be a better choice.
+ *
+ * This appender uses a layout.
+ *
+ * ## Configurable parameters: ##
+ *
+ * - **to** - Email address(es) to which the log will be sent. Multiple email
+ * addresses may be specified by separating them with a comma.
+ * - **from** - Email address which will be used in the From field.
+ * - **subject** - Subject of the email message.
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/mail.html Appender documentation
+ */
+class MailAppender extends AbstractAppender {
+
+ /**
+ * Email address to put in From field of the email.
+ * @var string
+ */
+ protected $from = null;
+
+ /**
+ * The subject of the email.
+ * @var string
+ */
+ protected $subject = 'Log4php Report';
+
+ /**
+ * One or more comma separated email addresses to which to send the email.
+ * @var string
+ */
+ protected $to = null;
+
+ /**
+ * Indiciates whether this appender should run in dry mode.
+ * @deprecated
+ * @var boolean
+ */
+ protected $dry = false;
+
+ /**
+ * Buffer which holds the email contents before it is sent.
+ * @var string
+ */
+ protected $body = '';
+
+ public function append(LoggingEvent $event) {
+ if($this->layout !== null) {
+ $this->body .= $this->layout->format($event);
+ }
+ }
+
+ public function close() {
+ if($this->closed != true) {
+ $from = $this->from;
+ $to = $this->to;
+
+ if(!empty($this->body) and $from !== null and $to !== null and $this->layout !== null) {
+ $subject = $this->subject;
+ if(!$this->dry) {
+ mail(
+ $to, $subject,
+ $this->layout->getHeader() . $this->body . $this->layout->getFooter(),
+ "From: {$from}\r\n");
+ } else {
+ echo "DRY MODE OF MAIL APP.: Send mail to: ".$to." with content: ".$this->body;
+ }
+ }
+ $this->closed = true;
+ }
+ }
+
+ /** Sets the 'subject' parameter. */
+ public function setSubject($subject) {
+ $this->setString('subject', $subject);
+ }
+
+ /** Returns the 'subject' parameter. */
+ public function getSubject() {
+ return $this->subject;
+ }
+
+ /** Sets the 'to' parameter. */
+ public function setTo($to) {
+ $this->setString('to', $to);
+ }
+
+ /** Returns the 'to' parameter. */
+ public function getTo() {
+ return $this->to;
+ }
+
+ /** Sets the 'from' parameter. */
+ public function setFrom($from) {
+ $this->setString('from', $from);
+ }
+
+ /** Returns the 'from' parameter. */
+ public function getFrom() {
+ return $this->from;
+ }
+
+ /** Enables or disables dry mode. */
+ public function setDry($dry) {
+ $this->setBoolean('dry', $dry);
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/MailEventAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/MailEventAppender.php b/src/Appenders/MailEventAppender.php
new file mode 100644
index 0000000..c49ba12
--- /dev/null
+++ b/src/Appenders/MailEventAppender.php
@@ -0,0 +1,180 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * MailEventAppender appends individual log events via email.
+ *
+ * This appender is similar to MailAppender, except that it sends each
+ * each log event in an individual email message at the time when it occurs.
+ *
+ * This appender uses a layout.
+ *
+ * ## Configurable parameters: ##
+ *
+ * - **to** - Email address(es) to which the log will be sent. Multiple email
+ * addresses may be specified by separating them with a comma.
+ * - **from** - Email address which will be used in the From field.
+ * - **subject** - Subject of the email message.
+ * - **smtpHost** - Used to override the SMTP server. Only works on Windows.
+ * - **port** - Used to override the default SMTP server port. Only works on
+ * Windows.
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/mail-event.html Appender documentation
+ */
+class MailEventAppender extends AbstractAppender {
+
+ /**
+ * Email address to put in From field of the email.
+ * @var string
+ */
+ protected $from;
+
+ /**
+ * Mail server port (widnows only).
+ * @var integer
+ */
+ protected $port = 25;
+
+ /**
+ * Mail server hostname (windows only).
+ * @var string
+ */
+ protected $smtpHost;
+
+ /**
+ * The subject of the email.
+ * @var string
+ */
+ protected $subject = 'Log4php Report';
+
+ /**
+ * One or more comma separated email addresses to which to send the email.
+ * @var string
+ */
+ protected $to = null;
+
+ /**
+ * Indiciates whether this appender should run in dry mode.
+ * @deprecated
+ * @var boolean
+ */
+ protected $dry = false;
+
+ public function activateOptions() {
+ if (empty($this->to)) {
+ $this->warn("Required parameter 'to' not set. Closing appender.");
+ $this->close = true;
+ return;
+ }
+
+ $sendmail_from = ini_get('sendmail_from');
+ if (empty($this->from) and empty($sendmail_from)) {
+ $this->warn("Required parameter 'from' not set. Closing appender.");
+ $this->close = true;
+ return;
+ }
+
+ $this->closed = false;
+ }
+
+ public function append(LoggingEvent $event) {
+ $smtpHost = $this->smtpHost;
+ $prevSmtpHost = ini_get('SMTP');
+ if(!empty($smtpHost)) {
+ ini_set('SMTP', $smtpHost);
+ }
+
+ $smtpPort = $this->port;
+ $prevSmtpPort= ini_get('smtp_port');
+ if($smtpPort > 0 and $smtpPort < 65535) {
+ ini_set('smtp_port', $smtpPort);
+ }
+
+ // On unix only sendmail_path, which is PHP_INI_SYSTEM i.e. not changeable here, is used.
+
+ $addHeader = empty($this->from) ? '' : "From: {$this->from}\r\n";
+
+ if(!$this->dry) {
+ $result = mail($this->to, $this->subject, $this->layout->getHeader() . $this->layout->format($event) . $this->layout->getFooter($event), $addHeader);
+ } else {
+ echo "DRY MODE OF MAIL APP.: Send mail to: ".$this->to." with additional headers '".trim($addHeader)."' and content: ".$this->layout->format($event);
+ }
+
+ ini_set('SMTP', $prevSmtpHost);
+ ini_set('smtp_port', $prevSmtpPort);
+ }
+
+ /** Sets the 'from' parameter. */
+ public function setFrom($from) {
+ $this->setString('from', $from);
+ }
+
+ /** Returns the 'from' parameter. */
+ public function getFrom() {
+ return $this->from;
+ }
+
+ /** Sets the 'port' parameter. */
+ public function setPort($port) {
+ $this->setPositiveInteger('port', $port);
+ }
+
+ /** Returns the 'port' parameter. */
+ public function getPort() {
+ return $this->port;
+ }
+
+ /** Sets the 'smtpHost' parameter. */
+ public function setSmtpHost($smtpHost) {
+ $this->setString('smtpHost', $smtpHost);
+ }
+
+ /** Returns the 'smtpHost' parameter. */
+ public function getSmtpHost() {
+ return $this->smtpHost;
+ }
+
+ /** Sets the 'subject' parameter. */
+ public function setSubject($subject) {
+ $this->setString('subject', $subject);
+ }
+
+ /** Returns the 'subject' parameter. */
+ public function getSubject() {
+ return $this->subject;
+ }
+
+ /** Sets the 'to' parameter. */
+ public function setTo($to) {
+ $this->setString('to', $to);
+ }
+
+ /** Returns the 'to' parameter. */
+ public function getTo() {
+ return $this->to;
+ }
+
+ /** Enables or disables dry mode. */
+ public function setDry($dry) {
+ $this->setBoolean('dry', $dry);
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/MongoDBAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/MongoDBAppender.php b/src/Appenders/MongoDBAppender.php
new file mode 100644
index 0000000..38d7dca
--- /dev/null
+++ b/src/Appenders/MongoDBAppender.php
@@ -0,0 +1,366 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+use Exception;
+
+use Mongo;
+use MongoCollection;
+use MongoDate;
+
+/**
+ * Appender for writing to MongoDB.
+ *
+ * This class was originally contributed by Vladimir Gorej.
+ *
+ * ## Configurable parameters: ##
+ *
+ * - **host** - Server on which mongodb instance is located.
+ * - **port** - Port on which the instance is bound.
+ * - **databaseName** - Name of the database to which to log.
+ * - **collectionName** - Name of the target collection within the given database.
+ * - **username** - Username used to connect to the database.
+ * - **password** - Password used to connect to the database.
+ * - **timeout** - For how long the driver should try to connect to the database (in milliseconds).
+ * @since 2.1
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/mongodb.html Appender documentation
+ * @link http://github.com/log4mongo/log4mongo-php Vladimir Gorej's original submission.
+ * @link http://www.mongodb.org/ MongoDB website.
+ */
+class MongoDBAppender extends AbstractAppender {
+
+ // ******************************************
+ // ** Constants **
+ // ******************************************
+
+ /** Default prefix for the {@link $host}. */
+ const DEFAULT_MONGO_URL_PREFIX = 'mongodb://';
+
+ /** Default value for {@link $host}, without a prefix. */
+ const DEFAULT_MONGO_HOST = 'localhost';
+
+ /** Default value for {@link $port} */
+ const DEFAULT_MONGO_PORT = 27017;
+
+ /** Default value for {@link $databaseName} */
+ const DEFAULT_DB_NAME = 'log4php_mongodb';
+
+ /** Default value for {@link $collectionName} */
+ const DEFAULT_COLLECTION_NAME = 'logs';
+
+ /** Default value for {@link $timeout} */
+ const DEFAULT_TIMEOUT_VALUE = 3000;
+
+ // ******************************************
+ // ** Configurable parameters **
+ // ******************************************
+
+ /** Server on which mongodb instance is located. */
+ protected $host;
+
+ /** Port on which the instance is bound. */
+ protected $port;
+
+ /** Name of the database to which to log. */
+ protected $databaseName;
+
+ /** Name of the collection within the given database. */
+ protected $collectionName;
+
+ /** Username used to connect to the database. */
+ protected $userName;
+
+ /** Password used to connect to the database. */
+ protected $password;
+
+ /** Timeout value used when connecting to the database (in milliseconds). */
+ protected $timeout;
+
+ // ******************************************
+ // ** Member variables **
+ // ******************************************
+
+ /**
+ * Connection to the MongoDB instance.
+ * @var Mongo
+ */
+ protected $connection;
+
+ /**
+ * The collection to which log is written.
+ * @var MongoCollection
+ */
+ protected $collection;
+
+ public function __construct($name = '') {
+ parent::__construct($name);
+ $this->host = self::DEFAULT_MONGO_URL_PREFIX . self::DEFAULT_MONGO_HOST;
+ $this->port = self::DEFAULT_MONGO_PORT;
+ $this->databaseName = self::DEFAULT_DB_NAME;
+ $this->collectionName = self::DEFAULT_COLLECTION_NAME;
+ $this->timeout = self::DEFAULT_TIMEOUT_VALUE;
+ $this->requiresLayout = false;
+ }
+
+ /**
+ * Setup db connection.
+ * Based on defined options, this method connects to the database and
+ * creates a {@link $collection}.
+ */
+ public function activateOptions() {
+ try {
+ $this->connection = new Mongo(sprintf('%s:%d', $this->host, $this->port), array('timeout' => $this->timeout));
+ $db = $this->connection->selectDB($this->databaseName);
+ if ($this->userName !== null && $this->password !== null) {
+ $authResult = $db->authenticate($this->userName, $this->password);
+ if ($authResult['ok'] == floatval(0)) {
+ throw new Exception($authResult['errmsg'], $authResult['ok']);
+ }
+ }
+ $this->collection = $db->selectCollection($this->collectionName);
+ } catch (\MongoConnectionException $ex) {
+ $this->closed = true;
+ $this->warn(sprintf('Failed to connect to mongo deamon: %s', $ex->getMessage()));
+ } catch (\InvalidArgumentException $ex) {
+ $this->closed = true;
+ $this->warn(sprintf('Error while selecting mongo database: %s', $ex->getMessage()));
+ } catch (\Exception $ex) {
+ $this->closed = true;
+ $this->warn('Invalid credentials for mongo database authentication');
+ }
+ }
+
+ /**
+ * Appends a new event to the mongo database.
+ *
+ * @param LoggingEvent $event
+ */
+ public function append(LoggingEvent $event) {
+ try {
+ if ($this->collection != null) {
+ $this->collection->insert($this->format($event));
+ }
+ } catch (\MongoCursorException $ex) {
+ $this->warn(sprintf('Error while writing to mongo collection: %s', $ex->getMessage()));
+ }
+ }
+
+ /**
+ * Converts the logging event into an array which can be logged to mongodb.
+ *
+ * @param LoggingEvent $event
+ * @return array The array representation of the logging event.
+ */
+ protected function format(LoggingEvent $event) {
+ $timestampSec = (int) $event->getTimestamp();
+ $timestampUsec = (int) (($event->getTimestamp() - $timestampSec) * 1000000);
+
+ $document = array(
+ 'timestamp' => new MongoDate($timestampSec, $timestampUsec),
+ 'level' => $event->getLevel()->toString(),
+ 'thread' => (int) $event->getThreadName(),
+ 'message' => $event->getMessage(),
+ 'loggerName' => $event->getLoggerName()
+ );
+
+ $locationInfo = $event->getLocationInformation();
+ if ($locationInfo != null) {
+ $document['fileName'] = $locationInfo->getFileName();
+ $document['method'] = $locationInfo->getMethodName();
+ $document['lineNumber'] = ($locationInfo->getLineNumber() == 'NA') ? 'NA' : (int) $locationInfo->getLineNumber();
+ $document['className'] = $locationInfo->getClassName();
+ }
+
+ $throwableInfo = $event->getThrowableInformation();
+ if ($throwableInfo != null) {
+ $document['exception'] = $this->formatThrowable($throwableInfo->getThrowable());
+ }
+
+ return $document;
+ }
+
+ /**
+ * Converts an Exception into an array which can be logged to mongodb.
+ *
+ * Supports innner exceptions (PHP >= 5.3)
+ *
+ * @param Exception $ex
+ * @return array
+ */
+ protected function formatThrowable(Exception $ex) {
+ $array = array(
+ 'message' => $ex->getMessage(),
+ 'code' => $ex->getCode(),
+ 'stackTrace' => $ex->getTraceAsString(),
+ );
+
+ if (method_exists($ex, 'getPrevious') && $ex->getPrevious() !== null) {
+ $array['innerException'] = $this->formatThrowable($ex->getPrevious());
+ }
+
+ return $array;
+ }
+
+ /**
+ * Closes the connection to the logging database
+ */
+ public function close() {
+ if($this->closed != true) {
+ $this->collection = null;
+ if ($this->connection !== null) {
+ $this->connection->close();
+ $this->connection = null;
+ }
+ $this->closed = true;
+ }
+ }
+
+ /**
+ * Sets the value of {@link $host} parameter.
+ * @param string $host
+ */
+ public function setHost($host) {
+ if (!preg_match('/^mongodb\:\/\//', $host)) {
+ $host = self::DEFAULT_MONGO_URL_PREFIX . $host;
+ }
+ $this->host = $host;
+ }
+
+ /**
+ * Returns the value of {@link $host} parameter.
+ * @return string
+ */
+ public function getHost() {
+ return $this->host;
+ }
+
+ /**
+ * Sets the value of {@link $port} parameter.
+ * @param int $port
+ */
+ public function setPort($port) {
+ $this->setPositiveInteger('port', $port);
+ }
+
+ /**
+ * Returns the value of {@link $port} parameter.
+ * @return int
+ */
+ public function getPort() {
+ return $this->port;
+ }
+
+ /**
+ * Sets the value of {@link $databaseName} parameter.
+ * @param string $databaseName
+ */
+ public function setDatabaseName($databaseName) {
+ $this->setString('databaseName', $databaseName);
+ }
+
+ /**
+ * Returns the value of {@link $databaseName} parameter.
+ * @return string
+ */
+ public function getDatabaseName() {
+ return $this->databaseName;
+ }
+
+ /**
+ * Sets the value of {@link $collectionName} parameter.
+ * @param string $collectionName
+ */
+ public function setCollectionName($collectionName) {
+ $this->setString('collectionName', $collectionName);
+ }
+
+ /**
+ * Returns the value of {@link $collectionName} parameter.
+ * @return string
+ */
+ public function getCollectionName() {
+ return $this->collectionName;
+ }
+
+ /**
+ * Sets the value of {@link $userName} parameter.
+ * @param string $userName
+ */
+ public function setUserName($userName) {
+ $this->setString('userName', $userName, true);
+ }
+
+ /**
+ * Returns the value of {@link $userName} parameter.
+ * @return string
+ */
+ public function getUserName() {
+ return $this->userName;
+ }
+
+ /**
+ * Sets the value of {@link $password} parameter.
+ * @param string $password
+ */
+ public function setPassword($password) {
+ $this->setString('password', $password, true);
+ }
+
+ /**
+ * Returns the value of {@link $password} parameter.
+ * @return string
+ */
+ public function getPassword() {
+ return $this->password;
+ }
+
+ /**
+ * Sets the value of {@link $timeout} parameter.
+ * @param int $timeout
+ */
+ public function setTimeout($timeout) {
+ $this->setPositiveInteger('timeout', $timeout);
+ }
+
+ /**
+ * Returns the value of {@link $timeout} parameter.
+ * @return int
+ */
+ public function getTimeout() {
+ return $this->timeout;
+ }
+ /**
+ * Returns the mongodb connection.
+ * @return Mongo
+ */
+ public function getConnection() {
+ return $this->connection;
+ }
+
+ /**
+ * Returns the active mongodb collection.
+ * @return MongoCollection
+ */
+ public function getCollection() {
+ return $this->collection;
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/NullAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/NullAppender.php b/src/Appenders/NullAppender.php
new file mode 100644
index 0000000..e599013
--- /dev/null
+++ b/src/Appenders/NullAppender.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\LoggingEvent;
+
+/**
+ * A NullAppender merely exists, it never outputs a message to any device.
+ *
+ * This appender has no configurable parameters.
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/null.html Appender documentation
+ */
+class NullAppender extends AbstractAppender {
+
+ /**
+ * This appender does not require a layout.
+ */
+ protected $requiresLayout = false;
+
+ /**
+ * Do nothing.
+ *
+ * @param LoggingEvent $event
+ */
+ public function append(LoggingEvent $event) {
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/79ed2d0d/src/Appenders/PdoAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/PdoAppender.php b/src/Appenders/PdoAppender.php
new file mode 100644
index 0000000..87c81bf
--- /dev/null
+++ b/src/Appenders/PdoAppender.php
@@ -0,0 +1,287 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache\Log4php\Appenders;
+
+use Apache\Log4php\Layouts\PatternLayout;
+use Apache\Log4php\LoggingEvent;
+use Apache\Log4php\Helpers\PatternParser;
+
+use PDO;
+use PDOException;
+
+/**
+ * PDOAppender appender logs to a database using the PHP's PDO extension.
+ *
+ * ## Configurable parameters: ##
+ *
+ * - dsn - The Data Source Name (DSN) used to connect to the database.
+ * - user - Username used to connect to the database.
+ * - password - Password used to connect to the database.
+ * - table - Name of the table to which log entries are be inserted.
+ * - insertSQL - Sets the insert statement for a logging event. Defaults
+ * to the correct one - change only if you are sure what you are doing.
+ * - insertPattern - The conversion pattern to use in conjuction with insert
+ * SQL. Must contain the same number of comma separated
+ * conversion patterns as there are question marks in the
+ * insertSQL.
+ * @since 2.0
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @link http://logging.apache.org/log4php/docs/appenders/pdo.html Appender documentation
+ */
+class PDOAppender extends AbstractAppender {
+
+ // ******************************************
+ // *** Configurable parameters ***
+ // ******************************************
+
+ /**
+ * DSN string used to connect to the database.
+ * @see http://www.php.net/manual/en/pdo.construct.php
+ */
+ protected $dsn;
+
+ /** Database user name. */
+ protected $user;
+
+ /** Database password. */
+ protected $password;
+
+ /**
+ * The insert query.
+ *
+ * The __TABLE__ placeholder will be replaced by the table name from
+ * {@link $table}.
+ *
+ * The questionmarks are part of the prepared statement, and they must
+ * match the number of conversion specifiers in {@link insertPattern}.
+ */
+ protected $insertSQL = "INSERT INTO __TABLE__ (timestamp, logger, level, message, thread, file, line) VALUES (?, ?, ?, ?, ?, ?, ?)";
+
+ /**
+ * A comma separated list of {@link LoggerPatternLayout} format strings
+ * which replace the "?" in {@link $insertSQL}.
+ *
+ * Must contain the same number of comma separated conversion patterns as
+ * there are question marks in {@link insertSQL}.
+ *
+ * @see LoggerPatternLayout For conversion patterns.
+ */
+ protected $insertPattern = "%date{Y-m-d H:i:s},%logger,%level,%message,%pid,%file,%line";
+
+ /** Name of the table to which to append log events. */
+ protected $table = 'log4php_log';
+
+ /** The number of recconect attempts to make on failed append. */
+ protected $reconnectAttempts = 3;
+
+
+ // ******************************************
+ // *** Private memebers ***
+ // ******************************************
+
+ /**
+ * The PDO instance.
+ * @var PDO
+ */
+ protected $db;
+
+ /**
+ * Prepared statement for the insert query.
+ * @var PDOStatement
+ */
+ protected $preparedInsert;
+
+ /** This appender does not require a layout. */
+ protected $requiresLayout = false;
+
+
+ // ******************************************
+ // *** Appender methods ***
+ // ******************************************
+
+ /**
+ * Acquires a database connection based on parameters.
+ * Parses the insert pattern to create a chain of converters which will be
+ * used in forming query parameters from logging events.
+ */
+ public function activateOptions() {
+ try {
+ $this->establishConnection();
+ } catch (PDOException $e) {
+ $this->warn("Failed connecting to database. Closing appender. Error: " . $e->getMessage());
+ $this->close();
+ return;
+ }
+
+ // Parse the insert patterns; pattern parts are comma delimited
+ $pieces = explode(',', $this->insertPattern);
+ $converterMap = PatternLayout::getDefaultConverterMap();
+ foreach($pieces as $pattern) {
+ $parser = new PatternParser($pattern, $converterMap);
+ $this->converters[] = $parser->parse();
+ }
+
+ $this->closed = false;
+ }
+
+ /**
+ * Connects to the database, and prepares the insert query.
+ * @throws PDOException If connect or prepare fails.
+ */
+ protected function establishConnection() {
+ // Acquire database connection
+ $this->db = new PDO($this->dsn, $this->user, $this->password);
+ $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ // Prepare the insert statement
+ $insertSQL = str_replace('__TABLE__', $this->table, $this->insertSQL);
+ $this->preparedInsert = $this->db->prepare($insertSQL);
+ }
+
+ /**
+ * Appends a new event to the database.
+ *
+ * If writing to database fails, it will retry by re-establishing the
+ * connection up to $reconnectAttempts times. If writing still fails,
+ * the appender will close.
+ */
+ public function append(LoggingEvent $event) {
+
+ for ($attempt = 1; $attempt <= $this->reconnectAttempts + 1; $attempt++) {
+ try {
+ // Attempt to write to database
+ $this->preparedInsert->execute($this->format($event));
+ $this->preparedInsert->closeCursor();
+ break;
+ } catch (PDOException $e) {
+ $this->warn("Failed writing to database: ". $e->getMessage());
+
+ // Close the appender if it's the last attempt
+ if ($attempt > $this->reconnectAttempts) {
+ $this->warn("Failed writing to database after {$this->reconnectAttempts} reconnect attempts. Closing appender.");
+ $this->close();
+ // Otherwise reconnect and try to write again
+ } else {
+ $this->warn("Attempting a reconnect (attempt $attempt of {$this->reconnectAttempts}).");
+ $this->establishConnection();
+ }
+ }
+ }
+ }
+
+ /**
+ * Converts the logging event to a series of database parameters by using
+ * the converter chain which was set up on activation.
+ */
+ protected function format(LoggingEvent $event) {
+ $params = array();
+ foreach($this->converters as $converter) {
+ $buffer = '';
+ while ($converter !== null) {
+ $converter->format($buffer, $event);
+ $converter = $converter->next;
+ }
+ $params[] = $buffer;
+ }
+ return $params;
+ }
+
+ /**
+ * Closes the connection to the logging database
+ */
+ public function close() {
+ // Close the connection (if any)
+ $this->db = null;
+
+ // Close the appender
+ $this->closed = true;
+ }
+
+ // ******************************************
+ // *** Accessor methods ***
+ // ******************************************
+
+ /**
+ * Returns the active database handle or null if not established.
+ * @return PDO
+ */
+ public function getDatabaseHandle() {
+ return $this->db;
+ }
+
+ /** Sets the username. */
+ public function setUser($user) {
+ $this->setString('user', $user);
+ }
+
+ /** Returns the username. */
+ public function getUser($user) {
+ return $this->user;
+ }
+
+ /** Sets the password. */
+ public function setPassword($password) {
+ $this->setString('password', $password);
+ }
+
+ /** Returns the password. */
+ public function getPassword($password) {
+ return $this->password;
+ }
+
+ /** Sets the insert SQL. */
+ public function setInsertSQL($sql) {
+ $this->setString('insertSQL', $sql);
+ }
+
+ /** Returns the insert SQL. */
+ public function getInsertSQL($sql) {
+ return $this->insertSQL;
+ }
+
+ /** Sets the insert pattern. */
+ public function setInsertPattern($pattern) {
+ $this->setString('insertPattern', $pattern);
+ }
+
+ /** Returns the insert pattern. */
+ public function getInsertPattern($pattern) {
+ return $this->insertPattern;
+ }
+
+ /** Sets the table name. */
+ public function setTable($table) {
+ $this->setString('table', $table);
+ }
+
+ /** Returns the table name. */
+ public function getTable($table) {
+ return $this->table;
+ }
+
+ /** Sets the DSN string. */
+ public function setDSN($dsn) {
+ $this->setString('dsn', $dsn);
+ }
+
+ /** Returns the DSN string. */
+ public function getDSN($dsn) {
+ return $this->setString('dsn', $dsn);
+ }
+}