Giter Site home page Giter Site logo

Comments (11)

rfoltyns avatar rfoltyns commented on September 21, 2024 1

Happy to help :)

In case of any Layout implementation, whatever comes out of it is usually the final form of Log4j2 LogEvent.

I'm sure that once you get familiar with Log4j2, Elasticsearch and this plugin, you'll discover that PatternLayout, JsonLayout and non-pooled JacksonJsonLayout are quite wasteful when it comes to memory. See how they perform and try out log4j2-elasticsearch-hc. Good luck!

Is there anything else I can help you with?

from log4j2-elasticsearch.

rfoltyns avatar rfoltyns commented on September 21, 2024 1

Unfortunately, event fields resolution with VirtuallProperty will not work here as the ValueResolver does not access serialized event (by design).

LogEvent field inclusion is controlled by mixins. You can enable threadId serialisation by specifying your own mixin with JacksonMixIn config. Have a look at the latest updates here.

Also, system property value is constant, so dynamic="true" is not necessary. It's false by default:

<VirtualProperty name="system" value="FSMC-FE" />

As for classpath:elasticTemplate.json, in Tomcat, you'll have to put it in the same classloader as log4j2 (and log4j2-elasticsearch) jars. Adding a jar to lib folder should do the trick:

<TOMCAT_HOME>
|── lib
    |──foo.jar
        |── elasticTemplate.json

from log4j2-elasticsearch.

rfoltyns avatar rfoltyns commented on September 21, 2024

@mvandak I'm terribly sorry for the late response.

In order for PatternLayout (or any other Layout) to work, it must produce a valid JSON output. %date{DEFAULT} [%8tid] %X{uuid} %5p %X{username} %c{1}:%L "%m"%n is not JSON.

You have a few options available, see this issue for guidance.

I hope it helps.

from log4j2-elasticsearch.

mvandak avatar mvandak commented on September 21, 2024

@rfoltyns Thank you Rafal for your answer, but I'm still lost. I already went thru that issue before I put my question.

I have the same configuration, no messsageOnly and mappingType=_doc.

This patternLayout conversion pattern we used is standard log4j2, no custom pattern layout. I already tried with pattern %m, but nothing changed. Based on that issue I expected to be fixed the standard work with patternLayout

from log4j2-elasticsearch.

rfoltyns avatar rfoltyns commented on September 21, 2024

PatternLayout is the wrong tool for the job.

Elasticsearch accepts valid JSON documents. PatternLayout with the pattern you configured serializes Log4j2 LogEvent into a bunch of words with no structure. You can "force" it to work - see example - but I don't recommend it.

If it works for you with JacksonJsonLayout - why not use it? It's not a custom layout - it is THE layout that this project supports (as opposed to PatternLayout which is supported by Log4j2 Project).

Thread name, level, and a few other properties are serialized by default. If you'd like them to be a part of "message" property, write you own serializer and use JacksonMixIn to override the defaults.

uuid and username can be serialized with VirtualProperty:

<VirtualProperty name="uuid" value="$${ctx:uuid:-notfound}"  dynamic="true" />

Would you consider switching back to JacksonJsonLayout?

from log4j2-elasticsearch.

mvandak avatar mvandak commented on September 21, 2024

I expected based on that issue you referenced that PatternLayout is working fine and I wanted to not need to map properties.

OK, I understand now, that in case of PatternLayout you can handle it only as one message string so the same type it will be in elasticsearch with no features like filters and so.

I have not so much experiance with log4j, nor with Elasticsearch yet, but I will try Jackson with mapping 😃

Thank you for your effort for now 👍

from log4j2-elasticsearch.

mvandak avatar mvandak commented on September 21, 2024

Hello Rafal. I half succeded with JacksonLayout and VirtualProperties.
ctx properties are working, but I am not able to get there ThreadId. When I configure virtual property to be $${event:ThreadId}

On server start I get error:

ERROR StatusLogger Cannot write item source: (was java.lang.NullPointerException) (through reference chain: org.apache.logging.log4j.core.impl.Log4jLogEvent["virtualProperties"])
ERROR StatusLogger An exception occurred processing Appender elasticsearchAsync
 java.lang.NullPointerException
	at org.appenders.log4j2.elasticsearch.jest.JestBulkOperations.createBatchItem(JestBulkOperations.java:59)
	at org.appenders.log4j2.elasticsearch.AsyncBatchDelivery.add(AsyncBatchDelivery.java:107)
	at org.appenders.log4j2.elasticsearch.ItemSourceAppender.append(ItemSourceAppender.java:54)
	at org.appenders.log4j2.elasticsearch.ItemSourceAppender.append(ItemSourceAppender.java:32)
	at org.appenders.log4j2.elasticsearch.ElasticsearchAppender.append(ElasticsearchAppender.java:73)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
	at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
	at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
	at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
	at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2198)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2152)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2135)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2016)
	at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1875)
	at org.apache.logging.slf4j.Log4jLogger.info(Log4jLogger.java:179)
	at org.quartz.ee.servlet.QuartzInitializerListener.contextDestroyed(QuartzInitializerListener.java:264)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4729)
	at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5393)
	at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:257)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:187)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:932)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:344)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
feb 04, 2021 7:58:16 AM org.apache.catalina.core.StandardContext listenerStop
SEVERE: Exception sending context destroyed event to listener instance of class [org.quartz.ee.servlet.QuartzInitializerListener]
org.apache.logging.log4j.core.appender.AppenderLoggingException: An exception occurred processing Appender elasticsearchAsync
	at org.apache.logging.log4j.core.appender.DefaultErrorHandler.error(DefaultErrorHandler.java:93)
	at org.apache.logging.log4j.core.config.AppenderControl.handleAppenderError(AppenderControl.java:165)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:158)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
	at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
	at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
	at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
	at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2198)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2152)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2135)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2016)
	at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1875)
	at org.apache.logging.slf4j.Log4jLogger.info(Log4jLogger.java:179)
	at org.quartz.ee.servlet.QuartzInitializerListener.contextDestroyed(QuartzInitializerListener.java:264)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4729)
	at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5393)
	at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:257)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:187)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:932)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:344)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
Caused by: java.lang.NullPointerException
	at org.appenders.log4j2.elasticsearch.jest.JestBulkOperations.createBatchItem(JestBulkOperations.java:59)
	at org.appenders.log4j2.elasticsearch.AsyncBatchDelivery.add(AsyncBatchDelivery.java:107)
	at org.appenders.log4j2.elasticsearch.ItemSourceAppender.append(ItemSourceAppender.java:54)
	at org.appenders.log4j2.elasticsearch.ItemSourceAppender.append(ItemSourceAppender.java:32)
	at org.appenders.log4j2.elasticsearch.ElasticsearchAppender.append(ElasticsearchAppender.java:73)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
	... 47 more

And also I am not able to load indexTemplate. It seems that I do not need it as far as it is working without it (except event properties), but just to let you know, if I configure indexTemplate, I get another error, that it is not able to load it through classLoader however, the template is in classpath together with log4j2.xml, so in build jar.

ERROR StatusLogger Could not create plugin of type class org.appenders.log4j2.elasticsearch.IndexTemplate for element IndexTemplate
 org.apache.logging.log4j.core.config.ConfigurationException
	at org.appenders.log4j2.elasticsearch.IndexTemplate$Builder.loadClasspathResource(IndexTemplate.java:196)
	at org.appenders.log4j2.elasticsearch.IndexTemplate$Builder.loadSource(IndexTemplate.java:136)
	at org.appenders.log4j2.elasticsearch.IndexTemplate$Builder.build(IndexTemplate.java:106)
	at org.appenders.log4j2.elasticsearch.IndexTemplate$Builder.build(IndexTemplate.java:67)
	at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1002)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:942)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:552)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)
	at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:288)
	at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:622)
	at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:695)
	at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:712)
	at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:267)
	at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155)
	at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
	at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
	at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:138)
	at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:45)
	at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:48)
	at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:30)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
	at sk.bwt.fsmc.frontend.ws.orders.SynchronizationOrdersService.<clinit>(SynchronizationOrdersService.java:33)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:398)
	at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.getImplementorClass(DeploymentDescriptorParser.java:585)
	at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parseAdapters(DeploymentDescriptorParser.java:226)
	at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parse(DeploymentDescriptorParser.java:149)
	at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.parseAdaptersAndCreateDelegate(WSServletContextListener.java:101)
	at com.sun.xml.ws.transport.http.servlet.WSServletContainerInitializer.onStartup(WSServletContainerInitializer.java:35)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5132)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:932)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:344)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
Caused by: java.lang.NullPointerException
	at java.base/java.io.Reader.<init>(Reader.java:167)
	at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:97)
	at org.appenders.log4j2.elasticsearch.IndexTemplate$Builder.loadClasspathResource(IndexTemplate.java:185)
	... 62 more

from log4j2-elasticsearch.

rfoltyns avatar rfoltyns commented on September 21, 2024

Could you post the configuration, please?

from log4j2-elasticsearch.

mvandak avatar mvandak commented on September 21, 2024
		<Elasticsearch name="elasticsearchAsync">
			<RollingIndexName indexName="log4j2-fsmc" pattern="yyyy-MM-dd-HH"
				timeZone="Europe/Bratislava" />
			<JacksonJsonLayout>
				<VirtualProperty name="uuid" value="$${ctx:uuid:-}"  dynamic="true" />
				<VirtualProperty name="user" value="$${ctx:username:-}" dynamic="true" />
				<VirtualProperty name="system" value="FSMC-FE" dynamic="true" />
				<VirtualProperty name="threadId" value="$${event:ThreadId:-}" dynamic="true" />
			</JacksonJsonLayout>
			<AsyncBatchDelivery batchSize="1000" deliveryInterval="5000">
				<IndexTemplate name="log4j2-fsmc" path="classpath:elasticTemplate.json" />
				<JestHttp serverUris="${elasticUrl}" mappingType="_doc" />
			</AsyncBatchDelivery>
		</Elasticsearch>

from log4j2-elasticsearch.

mvandak avatar mvandak commented on September 21, 2024

Thank you Rafal for your help. Your Mixin helped and it work now as expected 😃

In fact, the template I do not need. No special mapping needed.

Have a nice time!

from log4j2-elasticsearch.

rfoltyns avatar rfoltyns commented on September 21, 2024

Glad to help! 👍 Enjoy!

Re-consider the template - it's really useful. With composable templates and ILM policy support coming in 1.5.0 (very soon), it's worth having it set up properly. Plus, there's no obvious date column in serialized logs, so having the timeMillis field mapping in the template makes your life easier.

from log4j2-elasticsearch.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.