1//
2//  ========================================================================
3//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4//  ------------------------------------------------------------------------
5//  All rights reserved. This program and the accompanying materials
6//  are made available under the terms of the Eclipse Public License v1.0
7//  and Apache License v2.0 which accompanies this distribution.
8//
9//      The Eclipse Public License is available at
10//      http://www.eclipse.org/legal/epl-v10.html
11//
12//      The Apache License v2.0 is available at
13//      http://www.opensource.org/licenses/apache2.0.php
14//
15//  You may elect to redistribute this code under either of these licenses.
16//  ========================================================================
17//
18
19package org.eclipse.jetty.util.log;
20
21import java.util.logging.Level;
22
23/**
24 * <p>
25 * Implementation of Jetty {@link Logger} based on {@link java.util.logging.Logger}.
26 * </p>
27 *
28 * <p>
29 * You can also set the logger level using <a href="http://java.sun.com/j2se/1.5.0/docs/guide/logging/overview.html">
30 * standard java.util.logging configuration</a>.
31 * </p>
32 */
33public class JavaUtilLog extends AbstractLogger
34{
35    private Level configuredLevel;
36    private java.util.logging.Logger _logger;
37
38    public JavaUtilLog()
39    {
40        this("org.eclipse.jetty.util.log");
41    }
42
43    public JavaUtilLog(String name)
44    {
45        _logger = java.util.logging.Logger.getLogger(name);
46        if (Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.DEBUG", "false")))
47        {
48            _logger.setLevel(Level.FINE);
49        }
50        configuredLevel = _logger.getLevel();
51    }
52
53    public String getName()
54    {
55        return _logger.getName();
56    }
57
58    public void warn(String msg, Object... args)
59    {
60        _logger.log(Level.WARNING, format(msg, args));
61    }
62
63    public void warn(Throwable thrown)
64    {
65        warn("", thrown);
66    }
67
68    public void warn(String msg, Throwable thrown)
69    {
70        _logger.log(Level.WARNING, msg, thrown);
71    }
72
73    public void info(String msg, Object... args)
74    {
75        _logger.log(Level.INFO, format(msg, args));
76    }
77
78    public void info(Throwable thrown)
79    {
80        info("", thrown);
81    }
82
83    public void info(String msg, Throwable thrown)
84    {
85        _logger.log(Level.INFO, msg, thrown);
86    }
87
88    public boolean isDebugEnabled()
89    {
90        return _logger.isLoggable(Level.FINE);
91    }
92
93    public void setDebugEnabled(boolean enabled)
94    {
95        if (enabled)
96        {
97            configuredLevel = _logger.getLevel();
98            _logger.setLevel(Level.FINE);
99        }
100        else
101        {
102            _logger.setLevel(configuredLevel);
103        }
104    }
105
106    public void debug(String msg, Object... args)
107    {
108        _logger.log(Level.FINE, format(msg, args));
109    }
110
111    public void debug(Throwable thrown)
112    {
113        debug("", thrown);
114    }
115
116    public void debug(String msg, Throwable thrown)
117    {
118        _logger.log(Level.FINE, msg, thrown);
119    }
120
121    /**
122     * Create a Child Logger of this Logger.
123     */
124    protected Logger newLogger(String fullname)
125    {
126        return new JavaUtilLog(fullname);
127    }
128
129    public void ignore(Throwable ignored)
130    {
131        if (Log.isIgnored())
132        {
133            warn(Log.IGNORED, ignored);
134        }
135    }
136
137    private String format(String msg, Object... args)
138    {
139        msg = String.valueOf(msg); // Avoids NPE
140        String braces = "{}";
141        StringBuilder builder = new StringBuilder();
142        int start = 0;
143        for (Object arg : args)
144        {
145            int bracesIndex = msg.indexOf(braces, start);
146            if (bracesIndex < 0)
147            {
148                builder.append(msg.substring(start));
149                builder.append(" ");
150                builder.append(arg);
151                start = msg.length();
152            }
153            else
154            {
155                builder.append(msg.substring(start, bracesIndex));
156                builder.append(String.valueOf(arg));
157                start = bracesIndex + braces.length();
158            }
159        }
160        builder.append(msg.substring(start));
161        return builder.toString();
162    }
163}
164