Skip to content

Commit

Permalink
Add ability to turn on debug logging for Netty4
Browse files Browse the repository at this point in the history
  • Loading branch information
jakewins committed Feb 24, 2016
1 parent c0743a0 commit 87e5046
Show file tree
Hide file tree
Showing 7 changed files with 212 additions and 32 deletions.
Expand Up @@ -37,6 +37,7 @@
import org.neo4j.bolt.security.ssl.KeyStoreFactory;
import org.neo4j.bolt.security.ssl.KeyStoreInformation;
import org.neo4j.bolt.transport.BoltProtocol;
import org.neo4j.bolt.transport.Netty4LogBridge;
import org.neo4j.bolt.transport.NettyServer;
import org.neo4j.bolt.transport.SocketTransport;
import org.neo4j.bolt.v1.runtime.MonitoredSessions;
Expand All @@ -56,13 +57,16 @@
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.configuration.ConfigValues;
import org.neo4j.kernel.extension.KernelExtensionFactory;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.query.QueryExecutionEngine;
import org.neo4j.kernel.impl.spi.KernelContext;
import org.neo4j.kernel.impl.util.JobScheduler;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.kernel.lifecycle.Lifecycle;
import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.Log;
import org.neo4j.server.security.auth.AuthManager;
import org.neo4j.udc.UsageData;

import static org.neo4j.bolt.BoltKernelExtension.EncryptionLevel.OPTIONAL;
Expand Down Expand Up @@ -170,6 +174,12 @@ public interface Dependencies
UsageData usageData();

Monitors monitors();

AuthManager authManager();

ThreadToStatementContextBridge txBridge();

QueryExecutionEngine queryEngine();
}

public BoltKernelExtension()
Expand All @@ -190,11 +200,15 @@ public Lifecycle newInstance( KernelContext context, Dependencies dependencies )

final JobScheduler scheduler = dependencies.scheduler();

Netty4LogBridge.setLogProvider( logging.getInternalLogProvider() );

Sessions sessions =
new MonitoredSessions( dependencies.monitors(),
new ThreadedSessions(
life.add( new StandardSessions( api, dependencies.usageData(), logging ) ),
scheduler, logging ), Clock.systemUTC() );
new ThreadedSessions(
life.add( new StandardSessions( api, dependencies.usageData(), logging,
dependencies.txBridge(),
dependencies.queryEngine() ) ),
scheduler, logging ), Clock.systemUTC() );

List<NettyServer.ProtocolInitializer> connectors = new ArrayList<>();

Expand Down
Expand Up @@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.server.logging;
package org.neo4j.bolt.transport;

import io.netty.util.internal.logging.InternalLoggerFactory;

Expand Down
Expand Up @@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.server.logging;
package org.neo4j.bolt.transport;

import io.netty.util.internal.logging.AbstractInternalLogger;
import io.netty.util.internal.logging.InternalLogger;
Expand Down Expand Up @@ -53,13 +53,15 @@ public boolean isTraceEnabled()
@Override
public boolean isDebugEnabled()
{
return false;
return log.isDebugEnabled();
}

@Override
public boolean isInfoEnabled()
{
return false;
// No way to tell log level with better granularity yet, and INFO
// logging for Netty component is most likely DEBUG anyway
return log.isDebugEnabled();
}

@Override
Expand All @@ -83,19 +85,19 @@ public void debug( String s )
@Override
public void debug( String s, Object o )
{
log.debug( s, o );
log.debug( asNeoTemplate(s), o );
}

@Override
public void debug( String s, Object o, Object o1 )
{
log.debug( s, o, o1 );
log.debug( asNeoTemplate(s), o, o1 );
}

@Override
public void debug( String s, Object... objects )
{
log.debug( s, objects );
log.debug( asNeoTemplate(s), objects );
}

@Override
Expand All @@ -113,19 +115,19 @@ public void info( String s )
@Override
public void info( String s, Object o )
{
log.info( s, o );
log.info( asNeoTemplate(s), o );
}

@Override
public void info( String s, Object o, Object o1 )
{
log.info( s, o, o1 );
log.info( asNeoTemplate(s), o, o1 );
}

@Override
public void info( String s, Object... objects )
{
log.info( s, objects );
log.info( asNeoTemplate(s), objects );
}

@Override
Expand All @@ -143,19 +145,19 @@ public void warn( String s )
@Override
public void warn( String s, Object o )
{
log.warn( s, o );
log.warn( asNeoTemplate(s), o );
}

@Override
public void warn( String s, Object... objects )
{
log.warn( s, objects );
log.warn( asNeoTemplate(s), objects );
}

@Override
public void warn( String s, Object o, Object o1 )
{
log.warn( s, o, o1 );
log.warn( asNeoTemplate(s), o, o1 );
}

@Override
Expand All @@ -173,19 +175,19 @@ public void error( String s )
@Override
public void error( String s, Object o )
{
log.error( s, o );
log.error( asNeoTemplate(s), o );
}

@Override
public void error( String s, Object o, Object o1 )
{
log.error( s, o, o1 );
log.error( asNeoTemplate(s), o, o1 );
}

@Override
public void error( String s, Object... objects )
{
log.error( s, objects );
log.error( asNeoTemplate(s), objects );
}

@Override
Expand Down Expand Up @@ -224,6 +226,14 @@ public void trace( String s, Throwable throwable )

}

private String asNeoTemplate( String nettyLogTemplate )
{
// Netty uses MessageFormat as placeholders, we use String.format()
// Sidenote: MessageFormat is the right tool for this job, it handles
// pluralization, i18n etc., we should change at some point.
return nettyLogTemplate.replaceAll( "\\{\\}", "%s" );
}

};
}
}
Expand Up @@ -42,14 +42,18 @@ public class StandardSessions extends LifecycleAdapter implements Sessions

private CypherStatementRunner statementRunner;
private ThreadToStatementContextBridge txBridge;
private final QueryExecutionEngine engine;

public StandardSessions( GraphDatabaseAPI gds, UsageData usageData, LogService logging )
public StandardSessions( GraphDatabaseAPI gds,
UsageData usageData, LogService logging,
ThreadToStatementContextBridge txBridge,
QueryExecutionEngine engine )
{
this.gds = gds;
this.usageData = usageData;
this.logging = logging;
// TODO: Introduce a clean SPI rather than use GDS
this.txBridge = gds.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class );
this.txBridge = txBridge;
this.engine = engine;
}

@Override
Expand All @@ -61,8 +65,7 @@ public void init() throws Throwable
@Override
public void start() throws Throwable
{
QueryExecutionEngine queryExecutionEngine = gds.getDependencyResolver().resolveDependency( QueryExecutionEngine.class );
statementRunner = new CypherStatementRunner( gds, queryExecutionEngine );
statementRunner = new CypherStatementRunner( gds, engine );
life.start();
}

Expand Down
Expand Up @@ -30,20 +30,22 @@
import java.util.LinkedList;

import org.neo4j.bolt.v1.runtime.Session;
import org.neo4j.bolt.v1.runtime.Sessions;
import org.neo4j.bolt.v1.runtime.internal.StandardSessions;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.bolt.v1.runtime.internal.concurrent.ThreadedSessions;
import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.kernel.GraphDatabaseAPI;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;
import org.neo4j.kernel.impl.logging.NullLogService;
import org.neo4j.kernel.impl.query.QueryExecutionEngine;
import org.neo4j.kernel.impl.util.Neo4jJobScheduler;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.bolt.v1.runtime.Sessions;
import org.neo4j.bolt.v1.runtime.internal.concurrent.ThreadedSessions;
import org.neo4j.test.TestGraphDatabaseFactory;
import org.neo4j.udc.UsageData;

public class TestSessions implements TestRule, Sessions
{
private GraphDatabaseService gdb;
private GraphDatabaseAPI gdb;
private Sessions actual;
private LinkedList<Session> startedSessions = new LinkedList<>();
private final LifeSupport life = new LifeSupport();
Expand All @@ -56,10 +58,14 @@ public Statement apply( final Statement base, Description description )
@Override
public void evaluate() throws Throwable
{
gdb = new TestGraphDatabaseFactory().newImpermanentDatabase();
gdb = (GraphDatabaseAPI) new TestGraphDatabaseFactory().newImpermanentDatabase();
Neo4jJobScheduler scheduler = life.add( new Neo4jJobScheduler() );
DependencyResolver resolver = gdb.getDependencyResolver();
StandardSessions sessions = life.add(
new StandardSessions( (GraphDatabaseAPI) gdb, new UsageData(), NullLogService.getInstance() ) );
new StandardSessions( gdb, new UsageData(), NullLogService.getInstance(),
resolver.resolveDependency( ThreadToStatementContextBridge.class ),
resolver.resolveDependency( QueryExecutionEngine.class ))
);
actual = new ThreadedSessions(
sessions,
scheduler, NullLogService.getInstance() );
Expand Down

0 comments on commit 87e5046

Please sign in to comment.