Coder Social home page Coder Social logo

tinylog-org / tinylog Goto Github PK

View Code? Open in Web Editor NEW
665.0 12.0 82.0 51.4 MB

tinylog is a lightweight logging framework for Java, Kotlin, Scala, and Android

Home Page: https://tinylog.org

License: Apache License 2.0

Java 84.57% Kotlin 5.97% Scala 9.46%
java kotlin scala android logger logging-library kotlin-library jcl slf4j tinylog

tinylog's Introduction

tinylog 2

Build Code Coverage Maven Central Percentage of issues still open

Example

import org.tinylog.Logger;
    
public class Application {

    public static void main(String[] args) {
        Logger.info("Hello {}!", "world");
    }

}

Outputting log entries to the console and rolling log files via tinylog.properties

level            = INFO

writer1          = console
writer1.format   = {date: HH:mm:ss.SSS} {class}.{method}() {level}: {message}

writer2          = rolling file
writer2.file     = logs/{date: yyyy-MM-dd}/log_{count}.txt
writer2.policies = startup, daily: 03:00
writer2.format   = {date: HH:mm:ss} [{thread}] {level}: {message}

More information about tinylog including a detailed user manual and the Javadoc documentation can be found on https://tinylog.org/v2/.

Contributing

On GitHub, issues and pull requests are always welcome :)

For building tinylog or contributing to this project, please take a look at contributing.md.

License

Copyright 2016-2024 Martin Winandy

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

tinylog's People

Contributors

dependabot[bot] avatar f4lco avatar fourteenbrush avatar git5000 avatar kahgoh avatar kropp avatar manisiu avatar pabl0rg avatar pkarlowicz avatar pmwmedia avatar proohit avatar psimicek avatar q3769 avatar rhanneken avatar sezinkarli avatar simon04 avatar simonsilvalauinger avatar trigtrig avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tinylog's Issues

Trim anonymous classes from classname

I don't know how to tag this as a feature request and not a bug, but I was wondering if it would be possible to trim or remove the anonymous class portion from the classname written by the logger?

For example,

In tinylog.writer1.format I have:
tinylog.writer1.format = {date:hh:mm:ss.SSS} | {level} | {class}: {message}

In my source file, WikiParser I use extensive logging using some java 8 streams and junk. Unfortunately, the messages are formatted as:
03:45:54.177 | INFO | edu.utdallas.hltri.copa.wiki.WikiParser$$anonfun$2$$anonfun$apply$2$$anonfun$apply$4$$anonfun$apply$6$$anonfun$apply$8$$anonfun$apply$10: [Parsing XML] Saved "Mekong"

What I would like to see:
03:45:54.177 | INFO | edu.utdallas.hltri.copa.wiki.WikiParser: [Parsing XML] Saved "Mekong"

It seems, naively, that it might be as simple as triming everything in the classpath after (and including) the first '$'. I would have done this myself, but I can't figure out how to implement a custom format and I can't override the existing behavior because everything is final.

Setting indent makes stacktraces harder to read

Without having indent set in the formatting specs, a stacktrace logs like this:

02:11:41 DEBUG    [ForkJoinPool-1-worker-9  ] Batch                    :75 : java.net.SocketTimeoutException: Read timed out
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at 
[...]   at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
[...]

Setting the formatting to something like ...{message|indent=2} yields this output:

02:00:07 DEBUG    [ForkJoinPool-1-worker-15 ] Batch                    :75 : java.net.SocketTimeoutException: Read timed out
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at 
[...]
  at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
  Caused by: java.net.SocketTimeoutException: Read timed out
  at java.net.SocketInputStream.socketRead0(Native Method)
[...]

Note how the cause exception header is indented by two spaces in the second example, as are all other lines. This removes the visual clue that allows to quickly jump between exceptions when reading through a stracktrace. Is this by design (indent hard-aligns everything by amount specificed), cause I find the visual clue very helpful ...

Documentation for NoSuchMethodError: org.pmw.tinylog.Logger.output

I have following dependencies in my pom.xml.

	<dependency>
		<groupId>org.tinylog</groupId>
		<artifactId>tinylog</artifactId>
		<version>1.2</version>
	</dependency>
	<dependency>
		<!-- required for tomcat -->
		<groupId>org.tinylog</groupId>
		<artifactId>tinylog-jul</artifactId>
		<version>1.2</version>
	</dependency>
	<dependency>
		<groupId>org.tinylog</groupId>
		<artifactId>slf4j-binding</artifactId>
		<version>1.2</version>
	</dependency>

When running test cases, everything works, but when I run the jsp inside tomcat8, I get following output:

java.lang.NoSuchMethodError: org.pmw.tinylog.Logger.output(ILorg/pmw/tinylog/Level;Ljava/lang/Throwable;Ljava/lang/Object;[Ljava/lang/Object;)V
	org.pmw.tinylog.LogEntryForwarder.forward(Unknown Source)
	org.slf4j.impl.TinylogBridge.log(Unknown Source)

Is it possible to detail the documentation with that regard?

[Need advice] - Using tinylog in android app

Hi,
This is NOT an issue, but just an advice taking for using tinylog in my android app.
So, I want to use this in my android app and wanted to write the application logs here. It will be common file created hourly. I want to keep it multithreaded.

Here is what I think as the config :-

tinylog.writer = sharedfile
tinylog.writer.filename = mylog.txt
tinylog.writer.append = true
tinylog.writer.backups = 100
tinylog.writer.label = timestamp
tinylog.writer.policies = hourly, size: 100KB
tinylog.writingthread = true
tinylog.writingthread.observe = null
tinylog.writingthread.priority = 1

Queries

  • Will the above config allow creation and writing of log files on hourly basis
  • I am using Amazon S3 bucket to store the logs
  • Shall I write the config in property file in s3 bucket or use java code in android app itself.

any other suggestions are welcome.

website error - LoggingLevel

not sure where to report website issues, but, there seems to be error in the website example:

Configurator.defaultConfig()
 .writer(new FileWriter("log.txt"))
 .level(LoggingLevel.WARNING)
 .activate();

I guess it should be:

Configurator.defaultConfig()
 .writer(new FileWriter("log.txt"))
 .level(Level.WARNING)
 .activate();

JDBC writer

Reimplementation of JDBC writer for tinylog 2.0:

  • Implement all existing features
  • Write JUnit tests
  • Register writer as service

Shared file writer

Reimplementation of shared file writer for tinylog 2.0:

  • Implement all existing features
  • Support appending on all operating systems
  • Support buffering
  • Write JUnit tests
  • Register writer as service

[Question] How to show parent call in logging format?

We have a wrapper around TinyLog library, and when using our methods that delegate to TinyLog, the information that appears in the log for the placeholders {class}, {class_name} and {method} is the one of our wrapper.

Is it possible to select the "call stack level" to use for logging?

Logger placeholder in the format.

Hi,

I have a big project with logback and slf4j and as a first step of converting it to tinylog I didn't want to use the static logger. Using the sfl4j-facade you provided makes it seem like a drop in replacement. The only issue/question I have is when I'm specifying a custom format I need access to the placeholder variable for the "logger":

tinylog.format = [{{level}|min-size=7}] [{date:MMMM dd, YYYY HH:mm:ss.SSS z}] [{thread}] [{logger}] {message}\n

In case of the static logger I could just go for class, method etc, but it's not a static one, so if I were to use class.method I'd get sth like (I'm using scala btw, but it wasn't an issue with logback etc):

net.liftweb.common.Logger$class.warn()

To be clear the class you see in there is not mine :)

So is there a way to get to the logger instance? like {logger} or {source} or {src}...

Cheers

Choice-Syntax for Log-Entries

Hi,
it would be great if you could support a choice-syntax similar to {0,choice,0#Keinen|1#Einen|2#{0}} from MessageFormat.format(...).

For the new tinylog-syntax it could be a little bit simpler, like {0#Keinen|1#Einen|2#{}} ๐Ÿ˜‰
Best regards

Could it be that when the jdbc connection is lost the logger doesn't reconnect?

Hi, as the subject already says I have a question about whether the jdbc connection is reestablished automatically after it gets disconnected?

I have experienced that I had to restart my server to get new log data from tinylog although the application has been in use by users in the meantime.

Best regards and thank you for your support

tinylog.format in property file not used

I'm using tinylog in my application with this configuration file

tinylog.level = warning
tinylog.writer = console
tinylog.format = {date:yyyy-MM-dd HH:mm:ss}    {thread}    {class}.{method} {line}    {level}: {message}

but the item tinylog.format is not used, but if I set it with -D"tinylog.format = {date:yyyy-MM-dd HH:mm:ss} {thread} {class}.{method} {line} {level}: {message}" it works correctly. I'm using Logger.info and Logger.error directly without any other instantiation of tinylog

Ping

Hi, no real specific issue here. I just stumbled on this tool from https://github.com/akullpp/awesome-java#logging

This tool seems really nice as of 1.1 (what with the excellent documentation, RollingFileWriter, and the SLF4J binding)!

I was just wondering whether there are still plans to continue maintenance of 1.x and 2.0 development?

Either way, this looks great!

Crash when filename contains non-existent directory

If a file logger's filename contains a directory, creating the logger crashes if that directory does not exist.

For example:

tinylog.writer2 = rollingfile
tinylog.writer2.filename = logs/log.txt
tinylog.writer2.backups = 10

If I run this in a directory which does not yet contain a logs/ folder, the program crashes.

Given that the logfile itself is created at start-up, it seems reasonable that any folders in the filename should also be created.

bug in 1.0 branch w/ sfl4j: fixed

I was getting error getMDCA not found in your StaticMDCBinder class.

  • public NOPMDCAdapter getMDCA() {
  • public MDCAdapter getMDCA() {

and joy.
Still love your lib.
Cheers,
Vic

Add support for Supplier for lazy message generation

I like the idea of putting my log messages in a lambda, so that if a certain level is not configured to be output at all (not active), even the parts of the log message don't have to be looked for (or generated) in the calling thread in the first place. I think I have seen this in another logging framework (maybe Log4j).

Is this a possible improvement? And what would we have to consider about thread-safety and race conditions, especially with a separate Writer Thread?

NullPointerException when load tinylog with BootstrapClassLoader

First of all, thank you very much for this useful log library! We are using it in kamon-agent.

For some integration tests we need to load tinylog with the BootstrapClassLoader, and this is when this problem manifests itself.

The problem happens when it tries to do things like this:

Configurator.class.getClassLoader().getResourceAsStream(file);

The calling Configurator.class.getClassLoader() returns null since this is the way to say that it was loaded by the bootstrap class loader.

The fix is very simple. For example introducing a method like this:

private static InputStream getResourceFromFile(String file) {
    final ClassLoader classLoader = Configurator.class.getClassLoader();
    if (classLoader == null) {
      return ClassLoader.getSystemResourceAsStream(file);
    } else {
      return classLoader.getResourceAsStream(file);
    }
  }

And call it from any place where the resource is required.

Let me know if you are agreed with this change and I'll be happy to send a PR.

Support JavaEE DataSources in JdbcWriter

Data sources are an alternative way to declare JDBC database connection for Java EE. On the most web servers, the classic way of creating database connections via DriverManager.getConnection() works as well as via data sources. But tomcat, for example, doesn't support loading JDBC drivers as services out of the box. A clearcut solution would be to support data sources in JdbcWriter.

Data sources in Tomcat: https://wiki.apache.org/tomcat/UsingDataSources
Standard way: http://stackoverflow.com/questions/2279913/is-there-a-standard-way-to-define-a-jdbc-datasource-for-java-ee-containers#16261491

Is it possible to define custom Level via Configurator?

Looking at the existing source, I don't think that's possible.

I'm wondering if tinylog can support custom levels such as DEBUG1, DEBUG2, DEBUG3, DEBUG4, DEBUG5?

Right now when I use tinylog, I mostly use this:

        Configurator c = Configurator.currentConfig();
        c.level(Level.DEBUG);
        c.formatPattern("{date:HH:mm:ss} {level|min-size=8} {message}");
        c.activate();

But it would be nice to be able to control how much debugging to print out.

Rolling file writer

Reimplementation of rolling file writer for tinylog 2.0:

  • Implement size policy
  • Implement start-up policy
  • Implement daily policy
  • Implement all existing features
  • Reslove patterns in file path (e.g. writer.file = logs/{date:YYYY}/{pid}.log)
  • Write JUnit tests
  • Register policies and writer as service

tinylog version is not complied with osgi's version.

I tested with felix 4.4.1 and the error.
Caused by: java.lang.NumberFormatException: For input string: "rc1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at org.osgi.framework.Version.parseInt(Version.java:168)

does tinylog ready for a release version?

Log level on apache package not working?

I am getting too much verbosity out of the apache packages when I set the logging level to Level.DEBUG, I tried to disable the logging on the apache stuff, but doesn't seem to work?

    Configurator c = Configurator.currentConfig();
    c.level(Level.DEBUG); // set everything to debug by default
    // Trying to turn off other debug that I don't care
    //c.level("org.apache.http.client", Level.OFF);
    //c.level("org.apache.http.client.*", Level.OFF);
    //c.level("org.apache.http.impl.client", Level.OFF);
    //c.level("org.apache.commons.logging.simplelog.log.org.apache.http", Level.OFF);
    //c.level("org.apache.commons.logging.simplelog.log.org.apache.http.wire", Level.OFF);
    //c.level("org.apache.commons.logging.simplelog.log.org.apache.http.impl.conn", Level.OFF);
    //c.level("org.apache.commons.logging.simplelog.log.org.apache.http.impl.client", Level.OFF);
    //c.level("org.apache.commons.logging.simplelog.log.org.apache.http.client", Level.OFF);
    c.level("org.apache.http.impl.client", Level.OFF);
    c.formatPattern("{date:HH:mm:ss} {level|min-size=8} {message}");
    c.activate();

Is this a bug? Or does the "package" only works for tinylog's package? What is the proper way to make it work?

Unknown value type: "CONTEXT"

Hi tinylog-creators,
with the jdbc configuation below I get the following output:
LOGGER WARNING: Unknown value type: "CONTEXT"
LOGGER ERROR: Failed to activate configuration (java.sql.SQLException: Number of columns and values must be equal, but columns = 8 and values = 7)

JDBC config:
tinylog.writer = jdbc
tinylog.writer.url = jdbc:mysql://localhost:3306/<db_name>
tinylog.writer.table = log_entries_table
tinylog.writer.columns = context, level, message, class, line, date, method, exception
tinylog.writer.values = CONTEXT, LEVEL, MESSAGE, CLASS, LINE, DATE, METHOD, EXCEPTION

For the context column I took a text datatype in the database (MySQL).

Everything other than CONTEXT works fine. How can I make this work?

Best regards

Test failures in SharedFileWriterTest on Linux systems

Running SharedFileWriterTest on Linux I get test failures as described here: https://github.com/jotomo/tinylog/commit/0b41014894d5986d163e266411d993abaa1ca9ee, indicating a problem when writing to a log file concurrently.
@pmwmedia I'm assuming you're running Windows. TravisCI would run the tests on Linux - I've seen you tested TravisCI but dropped it again. Remember why?

Updated: running a Linux system natively, or a Linux VM on a Linux hosts, there are intermittend build failures in tests that inherit from AbstractTimeBasedPolicy (mostly in WeeklyPolicyTest). These failures occur 1-3 times out of 10 on an Arch Linux system (as December 2015). It seems that the SystemTimeMock is not thread-safe and occassionally returns the actual system time, leading to test failures.

How to write specific logs to different files ?

I am using tinylog for various features it has. My application needs a very fast asynchronous logging. I can able to log happily. I have only two issues.

  1. All my error logs and the info, some debug logs are jumbled into a single file. How can I separate these, such that they come into a single file say "errors.log" and info strings come into another file say "messages.log"?

  2. I want the timestamp to be in microseconds that mean like, data: Time in "HH:mm:ss:milli-seconds:Micro-seconds". Is there any way to do?

This is my properties file:
tinylog.writer = rollingfile
tinylog.writer.filename = MessageLogs.txt
tinylog.writer.backups = 1
tinylog.writer.label = timestamp
tinylog.writer.policies = daily, size: 1000KB
tinylog.writingthread = true
tinylog.writingthread.observe = null
tinylog.writingthread.priority = 2
tinylog.format = {date:yyyy-MM-dd HH:mm:ss:sss} {class}.{method}()\n{level}: {message}

jdbcwriter didn't work

Hello,

I try to setup a jdbcwriter but I got following errors:

LOGGER ERROR: Failed to activate configuration (java.sql.SQLException: No suitable driver found for jdbc:mysql://10.211.55.5:3306/XXXXXX)

However the mysql driver is in project path (class path) as well as in server lib (Tomcat). My application can access the mysql database.

Any suggestion? Did I miss a configuration?

Thx

Benchmarks based on JMH

Implement JMH benchmarks to compare tinylog 2.0 with other logging frameworks. Logging format pattern and stack trace depth should be configurable.

tinylog 1.0.1 not processing Java system properties correctly.

I noticed a problem in how tinylog processes Java system properties. When (the equivilant of) -Dtinylog.level=debug is passed in on the command line, it does not appear to be processed correctly. Here is a test that reproduces the problem.

package org.tinylog.bugreport;

import org.junit.Test;
import org.pmw.tinylog.Logger;

import static org.junit.Assert.assertEquals;

public class SystemPropertyTest {

    @Test
    public void loggers() {
        String tinylog_level = System.getProperty("tinylog.level");
        Logger.info("tinylog.level=" + tinylog_level);
        Logger.debug("Log level debug");
        assertEquals(tinylog_level,Logger.getLevel().name());
    }
}

Here is the gradle script that I used to compile and run the test.

apply plugin: 'java'

String _logLevel = hasProperty('logLevel') ? project.properties.get('logLevel'): 'info'

repositories {
    jcenter()
}

dependencies {
    testCompile 'junit:junit:4.12'
    testCompile 'org.tinylog:tinylog:1.0.1'
}
test {
    testLogging {
        events "passed", "skipped", "failed", "standardOut", "standardError"
    }
    // Pass in upshifted logging level as a Java System Property to the test.
    systemProperty 'tinylog.level', _logLevel.toUpperCase()
}

Using the above here is the result of the test when logLevel info is passed in, followed by logLevel debug.

tinylog.level=info

gradle -PlogLevel=info clean test 
:clean
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test

org.tinylog.bugreport.SystemPropertyTest > loggers STANDARD_OUT
    2015-09-29 11:30:05 [Test worker] org.tinylog.bugreport.SystemPropertyTest.loggers()
    INFO: tinylog.level=INFO

org.tinylog.bugreport.SystemPropertyTest > loggers PASSED

BUILD SUCCESSFUL

Total time: 1.523 secs

tinylog.level=debug

gradle -PlogLevel=debug clean test 
:clean
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test

org.tinylog.bugreport.SystemPropertyTest > loggers STANDARD_OUT
    2015-09-29 11:31:07 [Test worker] org.tinylog.bugreport.SystemPropertyTest.loggers()
    INFO: tinylog.level=DEBUG

org.tinylog.bugreport.SystemPropertyTest > loggers FAILED
    org.junit.ComparisonFailure at SystemPropertyTest.java:15

1 test completed, 1 failed
:test FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/michael.ottati/z-tmp/tinylog/build/reports/tests/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 1.57 secs

When I go back to the 0.8.1 version I had been using before (modifying the Logger.getLevel() call) this test works as expected, it passes at both tinylog.levels.

I could not step it though the initialization to see what happens there, it looks like this library ships without debug symbols.

Here are the first copule of lines of the failure exception in the gradle/JUnit html report that gets created by the build.

org.junit.ComparisonFailure: expected:<[DEBUG]> but was:<[INFO]>
    at org.junit.Assert.assertEquals(Assert.java:115)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at org.tinylog.bugreport.SystemPropertyTest.loggers(SystemPropertyTest.java:15)

Thanks for all the work that you do on this package, it has come in very handy where I work.

Colored console output

FEATURE REQUEST

Please add a possibility for coloured console output.

  • Problem:
    Currently, coloring is not available for console output (but I love it ;-) ). The workaround to specify multiple console writers (colorize the different levels) does not work as they are all used, leading to multiple outputs with the same content (different formats though), e.g. the debug level writer format is also used for higher levels.

Of course, coloured outputs could be deeply integrated into Tinylog. However, it also be simple with the following options:

  • Possible solution:
    • Force a console logger to the selected level (or set of levels).
      Then, the level specific writers do not apply on higher logger levels (e.g. "debug, info" will not apply on warning or error). Then, the level format can include ASCII colour codes for each level and content placeholder.
    • Allow hierarchical overwrites.
      For example, if you have to consoler writers, writerInfo for info level and writerWarn for warning level, only the writerWarn will be used for warnings and lower level writers ignored.

I love tinylog and just migrated my whole project :-)
Would be great if you could consider my requerst.

Cheers,
Tobias

Support for Android

Tasks:

  • Implementing a writer for Logcat
  • Using Android API for getting class for log entries
  • Verifying if Android API is existing for getting method, filename and line, too
  • Using Android API for getting process ID
  • Everything else that you can imagine to make the life easier for Android developers

Make output stream for console writer configurable

Currently the console writer writes all log entries with severity levels trace, debug and info to the "standard" output stream (System.out). Log entries with severity levels warning and error are written to the "standard" error output stream (System.err).

The threshold for using the "standard" error output stream should be configurable. For example, if the threshold is trace, all log entries should be written to System.err. If the threshold is off, all log entries should be written to System.out. The default threshold is warning to be compatible with previous tinylog versions (severity levels trace, debug and info to System.out and accordingly warning and error to System.err).

  • Update ConsoleWriter
  • Write JUnit tests
  • Reimplement for tinylog 2.0

Log output to UTF-8

Hi, I recently started using tinylog and it's great.

However, I noticed that it outputs log files to the character set default of the platform (i.e. on OSX it's UTF-8 and on Windows it's ANSI).

It would be good if one could specify the output character set or otherwise enforce UTF-8 across the board (which is actually what I'm after)

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.