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.KeyStoreFactory;
import org.neo4j.bolt.security.ssl.KeyStoreInformation; import org.neo4j.bolt.security.ssl.KeyStoreInformation;
import org.neo4j.bolt.transport.BoltProtocol; import org.neo4j.bolt.transport.BoltProtocol;
import org.neo4j.bolt.transport.Netty4LogBridge;
import org.neo4j.bolt.transport.NettyServer; import org.neo4j.bolt.transport.NettyServer;
import org.neo4j.bolt.transport.SocketTransport; import org.neo4j.bolt.transport.SocketTransport;
import org.neo4j.bolt.v1.runtime.MonitoredSessions; import org.neo4j.bolt.v1.runtime.MonitoredSessions;
Expand All @@ -56,13 +57,16 @@
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.configuration.ConfigValues; import org.neo4j.kernel.configuration.ConfigValues;
import org.neo4j.kernel.extension.KernelExtensionFactory; 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.logging.LogService;
import org.neo4j.kernel.impl.query.QueryExecutionEngine;
import org.neo4j.kernel.impl.spi.KernelContext; import org.neo4j.kernel.impl.spi.KernelContext;
import org.neo4j.kernel.impl.util.JobScheduler; import org.neo4j.kernel.impl.util.JobScheduler;
import org.neo4j.kernel.lifecycle.LifeSupport; import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.kernel.lifecycle.Lifecycle; import org.neo4j.kernel.lifecycle.Lifecycle;
import org.neo4j.kernel.monitoring.Monitors; import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.Log; import org.neo4j.logging.Log;
import org.neo4j.server.security.auth.AuthManager;
import org.neo4j.udc.UsageData; import org.neo4j.udc.UsageData;


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


Monitors monitors(); Monitors monitors();

AuthManager authManager();

ThreadToStatementContextBridge txBridge();

QueryExecutionEngine queryEngine();
} }


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


final JobScheduler scheduler = dependencies.scheduler(); final JobScheduler scheduler = dependencies.scheduler();


Netty4LogBridge.setLogProvider( logging.getInternalLogProvider() );

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


List<NettyServer.ProtocolInitializer> connectors = new ArrayList<>(); 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 * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * 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; 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 * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * 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.AbstractInternalLogger;
import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLogger;
Expand Down Expand Up @@ -53,13 +53,15 @@ public boolean isTraceEnabled()
@Override @Override
public boolean isDebugEnabled() public boolean isDebugEnabled()
{ {
return false; return log.isDebugEnabled();
} }


@Override @Override
public boolean isInfoEnabled() 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 @Override
Expand All @@ -83,19 +85,19 @@ public void debug( String s )
@Override @Override
public void debug( String s, Object o ) public void debug( String s, Object o )
{ {
log.debug( s, o ); log.debug( asNeoTemplate(s), o );
} }


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


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


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


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


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


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


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


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


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


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


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


@Override @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 CypherStatementRunner statementRunner;
private ThreadToStatementContextBridge txBridge; 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.gds = gds;
this.usageData = usageData; this.usageData = usageData;
this.logging = logging; this.logging = logging;
// TODO: Introduce a clean SPI rather than use GDS this.txBridge = txBridge;
this.txBridge = gds.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class ); this.engine = engine;
} }


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


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


import org.neo4j.bolt.v1.runtime.Session; 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.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.GraphDatabaseAPI;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;
import org.neo4j.kernel.impl.logging.NullLogService; 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.impl.util.Neo4jJobScheduler;
import org.neo4j.kernel.lifecycle.LifeSupport; 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.test.TestGraphDatabaseFactory;
import org.neo4j.udc.UsageData; import org.neo4j.udc.UsageData;


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

0 comments on commit 87e5046

Please sign in to comment.