Return-Path: X-Original-To: apmail-logging-commits-archive@minotaur.apache.org Delivered-To: apmail-logging-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id DC00C10745 for ; Thu, 28 Nov 2013 16:07:11 +0000 (UTC) Received: (qmail 34556 invoked by uid 500); 28 Nov 2013 16:04:10 -0000 Delivered-To: apmail-logging-commits-archive@logging.apache.org Received: (qmail 34330 invoked by uid 500); 28 Nov 2013 16:03:55 -0000 Mailing-List: contact commits-help@logging.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@logging.apache.org Delivered-To: mailing list commits@logging.apache.org Received: (qmail 33759 invoked by uid 99); 28 Nov 2013 16:03:33 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 28 Nov 2013 16:03:33 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 7CEE790FC6A; Thu, 28 Nov 2013 16:03:32 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ihabunek@apache.org To: commits@logging.apache.org Date: Thu, 28 Nov 2013 16:03:57 -0000 Message-Id: <0b397b85e1f746cba02acf176756cdf5@git.apache.org> In-Reply-To: <33022fd6f25443dba3852df16be4c47a@git.apache.org> References: <33022fd6f25443dba3852df16be4c47a@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [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 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 Authored: Thu Nov 28 13:48:45 2013 +0100 Committer: Ivan Habunek 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. --> - - src/test/php + tests/src - + - src/main/php + src/ - + - + + + 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 @@ +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 @@ +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 null 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 null 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 append() 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. + * + *

If this method returns true, meaning that layout is required, + * then the configurator will configure a layout using the configuration + * information at its disposal. If this method returns false, + * 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.

+ * + *

In the rather exceptional case, where the appender + * implementation admits a layout but can also work without it, then + * the appender should return true.

+ * + * @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 true. + * + * @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 @@ +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 @@ +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 datePattern. */ + 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 @@ + 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
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 @@ +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 @@ +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 @@ +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 @@ +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 @@ +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); + } +}